<?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.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>✨ Transformative design: no longer designing uses, but metamorphoses</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Fri, 01 May 2026 06:39:23 +0000</pubDate>
      <link>https://dev.to/matyo91/transformative-design-no-longer-designing-uses-but-metamorphoses-9i8</link>
      <guid>https://dev.to/matyo91/transformative-design-no-longer-designing-uses-but-metamorphoses-9i8</guid>
      <description>&lt;p&gt;On April 30th, at Le Laptop in Paris, an event took place that broke away from the beaten path of classic Product Design: &lt;strong&gt;“Transformative Design: Don't just create uses, transform users”&lt;/strong&gt;, presented by David Jeanne and organized by Jordan Thévenot.&lt;/p&gt;

&lt;p&gt;In a room filled with around forty participants—designers, developers, and product specialists—the promise was clear: to question the current limitations of UX and propose a new direction. A direction where design no longer simply optimizes interfaces, but seeks to produce profound transformations for users.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4665.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4665.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From Experience to Transformation&lt;/p&gt;

&lt;p&gt;Product design has long sought to make things simpler.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less friction.&lt;/li&gt;
&lt;li&gt;Less effort.&lt;/li&gt;
&lt;li&gt;Less complexity.&lt;/li&gt;
&lt;li&gt;Less waiting time.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a powerful promise. But it also has a limitation: by smoothing everything over, we sometimes end up smoothing over meaning itself.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4666.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4666.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;David Jeanne starts from an idea from &lt;em&gt;The Experience Economy&lt;/em&gt;: the economy evolves in stages.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We started by selling raw materials.&lt;/li&gt;
&lt;li&gt;Then products.&lt;/li&gt;
&lt;li&gt;Then services.&lt;/li&gt;
&lt;li&gt;Then experiments.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But when the experience itself becomes commonplace, what remains to differentiate oneself?&lt;/p&gt;

&lt;p&gt;The proposed answer is powerful: &lt;strong&gt;transformation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It's no longer just about selling a pleasant interface or a smooth user journey. It's about designing an experience that helps a person become someone else.&lt;/p&gt;

&lt;p&gt;For example :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;to go from “I am not sporty” to “I take care of my body”;&lt;/li&gt;
&lt;li&gt;moving from “I am at the mercy of my money” to “I am building my future”;&lt;/li&gt;
&lt;li&gt;to move from “I am just a resource” to “I am an active participant in the project”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4667.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4667.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is where design becomes transformative.&lt;/p&gt;

&lt;h2&gt;
  
  
  Designing a passage, not just a route
&lt;/h2&gt;

&lt;p&gt;Classical design often works with a persona: their needs, their pains, their motivations.&lt;/p&gt;

&lt;p&gt;Transformative design adds a deeper question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How ​​do we want to help this person to grow?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This completely changes the nature of the work.&lt;/p&gt;

&lt;p&gt;We no longer just design a user journey.&lt;br&gt;
We design a passage.&lt;/p&gt;

&lt;p&gt;A passage between a current self and a possible self.&lt;/p&gt;

&lt;p&gt;This transition can follow the structure of initiation rites: a preparation phase, a turning point phase, and then an integration phase. The goal is not simply to create a "wow" effect, but to create an experience that leaves a lasting impression.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4674.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4674.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The role of rituals, symbols and objects
&lt;/h2&gt;

&lt;p&gt;One of the most interesting aspects of the conference is the importance given to symbols.&lt;/p&gt;

&lt;p&gt;A transformation does not happen solely through rational arguments. It also happens through forms, gestures, objects, places, words, and postures.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4679.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4679.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the example presented, a simple, traditional meeting was transformed into a ritualistic moment. The chairs disappeared, a large strategic map was placed on the table, and the computer was put aside. The client was no longer simply someone who "gave a brief." They gradually became a strategist.&lt;/p&gt;

&lt;p&gt;And this change in physical posture can trigger a change in mental posture.&lt;/p&gt;

&lt;p&gt;This is a key idea: &lt;strong&gt;design transforms not only by what it explains, but by what it brings to life&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve, amplify, help, dissolve, transform
&lt;/h2&gt;

&lt;p&gt;David Jeanne presents an interesting matrix for deciding what to do with the existing elements in the experiment.&lt;/p&gt;

&lt;p&gt;Certain elements must be preserved, as they ensure the psychological safety of the user.&lt;br&gt;
Others need to be amplified, because they are already moving in the direction of the desired transformation.&lt;br&gt;
Others need help when they are simply irritants to be removed.&lt;/p&gt;

&lt;p&gt;Then come the deeper dimensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;dissolve certain reference points;&lt;/li&gt;
&lt;li&gt;to transform certain identity-related blockages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where transformative design differs from traditional UX. It doesn't just aim to reduce problems; it seeks to identify what prevents a person from changing their perspective on themselves.&lt;/p&gt;

&lt;h2&gt;
  
  
  A central ethical question
&lt;/h2&gt;

&lt;p&gt;Such a design obviously raises a question: how far can we go?&lt;/p&gt;

&lt;p&gt;While design can transform, it can also manipulate.&lt;/p&gt;

&lt;p&gt;The conference emphasizes this point: the model presented aims for empowerment, not subjugation. But this imposes a strong requirement regarding consent, protection, and intent.&lt;/p&gt;

&lt;p&gt;Designing a transformation is not a neutral process.&lt;/p&gt;

&lt;p&gt;This is likely one of the major topics of the coming years, especially with the massive integration of AI into digital products. Interfaces will become more adaptive, more personalized, and more persuasive. The line between guidance and manipulation will become increasingly blurred.&lt;/p&gt;

&lt;h2&gt;
  
  
  My takeaway for Darkwood
&lt;/h2&gt;

&lt;p&gt;This conference resonates strongly with the topics I explore around Darkwood, Flow, and automation.&lt;/p&gt;

&lt;p&gt;Today, many tools aim to save time. But save time for what purpose?&lt;/p&gt;

&lt;p&gt;A good product shouldn't just automate a task. It should help its user change their approach.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To go from consumer to creator.&lt;/li&gt;
&lt;li&gt;To move from executor to architect.&lt;/li&gt;
&lt;li&gt;To go from spectator to player.&lt;/li&gt;
&lt;li&gt;To go from being overwhelmed to being able to orchestrate their own systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is probably where part of the value of future products lies: not in the total elimination of effort, but in the design of efforts that transform.&lt;/p&gt;

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

&lt;p&gt;Transformative design encourages us to move beyond a purely utilitarian view of the product.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A product can be more than just a tool.&lt;/li&gt;
&lt;li&gt;It can become a ritual.&lt;/li&gt;
&lt;li&gt;A passage.&lt;/li&gt;
&lt;li&gt;A mirror.&lt;/li&gt;
&lt;li&gt;A trigger.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The question is therefore no longer simply:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“What use are we creating?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But rather:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“What kind of person are we helping to emerge?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Going further&lt;/p&gt;

&lt;p&gt;David Jeanne has launched a campaign for his book dedicated to transformative design, which delves deeper into these concepts with concrete and operational methods.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://fr.ulule.com/design-transformatif-livre/" rel="noopener noreferrer"&gt;https://fr.ulule.com/design-transformatif-livre/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4664.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4664.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4668.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4668.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4669.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4669.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4670.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4670.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4671.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4671.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4673.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4673.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4675.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4675.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4676.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4676.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4677.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4677.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4678.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4678.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4680.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4680.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4681.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4681.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4682.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4682.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4683.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4683.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4684.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4684.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4685.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4685.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4686.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4686.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4687.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4687.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4688.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-30-le-design-transformatif/resized_IMG_4688.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>⚙️ Hermes X Paperclip - Building a Governed Multi-Agent Architecture with Symfony AI, Flow, and Navi</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Thu, 30 Apr 2026 12:19:19 +0000</pubDate>
      <link>https://dev.to/matyo91/hermes-x-paperclip-building-a-governed-multi-agent-architecture-with-symfony-ai-flow-and-navi-31jd</link>
      <guid>https://dev.to/matyo91/hermes-x-paperclip-building-a-governed-multi-agent-architecture-with-symfony-ai-flow-and-navi-31jd</guid>
      <description>&lt;p&gt;Multi-agent systems are everywhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;orchestrated via Docker: &lt;a href="https://blog.darkwood.com/fr/article/ai-tinkerers-paris-agentic-workflows-avec-docker-vers-des-systemes-autonomes-securises-et-orchestres" rel="noopener noreferrer"&gt;https://blog.darkwood.com/fr/article/ai-tinkerers-paris-agentic-workflows-avec-docker-vers-des-systemes-autonomes-securises-et-orchestres&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Simulated using frameworks like Paperclip + Hermes: &lt;a href="https://www.youtube.com/watch?v=j7cKjTMjNLE" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=j7cKjTMjNLE&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;or integrated directly into products: &lt;a href="https://docs.langchain.com/oss/python/langchain/multi-agent" rel="noopener noreferrer"&gt;https://docs.langchain.com/oss/python/langchain/multi-agent&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But in most cases, they remain:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ collections of prompts&lt;br&gt;&lt;br&gt;
❌ without governance&lt;br&gt;&lt;br&gt;
❌ without traceability&lt;br&gt;&lt;br&gt;
❌ without clear responsibility&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this article, we will build an alternative, not as a fictional startup, but as a concrete example:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NoLife Agency - a digital agency entirely driven by a governed multi-agent architecture.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
a digital agency that produces client websites with specialized roles.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🏢 NoLife Agency - a complete organization
&lt;/h2&gt;

&lt;p&gt;Unlike simplistic demos, NoLife Agency replicates a real organization:&lt;/p&gt;

&lt;h3&gt;
  
  
  Direction
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CEO&lt;/li&gt;
&lt;li&gt;CTO&lt;/li&gt;
&lt;li&gt;Governance Director Manager&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Client &amp;amp; Delivery
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Account Manager&lt;/li&gt;
&lt;li&gt;Product Owner&lt;/li&gt;
&lt;li&gt;Delivery Manager&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Production
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Architect&lt;/li&gt;
&lt;li&gt;Developer&lt;/li&gt;
&lt;li&gt;UX Designer&lt;/li&gt;
&lt;li&gt;UI Designer
Graphic Designer&lt;/li&gt;
&lt;li&gt;Motion Designer&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Growth
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;SEO / GEO&lt;/li&gt;
&lt;li&gt;Marketing&lt;/li&gt;
&lt;li&gt;Sales&lt;/li&gt;
&lt;li&gt;Web Analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Support &amp;amp; Reliability
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;QA&lt;/li&gt;
&lt;li&gt;DevOps&lt;/li&gt;
&lt;li&gt;Security Officer&lt;/li&gt;
&lt;li&gt;Data Analyst&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Internal Organization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Experience Officer&lt;/li&gt;
&lt;li&gt;Office Manager&lt;/li&gt;
&lt;li&gt;Happiness Chief Officer&lt;/li&gt;
&lt;li&gt;Nolife Resource&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Here, each role can be played by an agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ The trap of multi-agent architectures
&lt;/h2&gt;

&lt;p&gt;What many are building:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Prompt → LLM → résultat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is:&lt;/p&gt;

&lt;p&gt;*no guarantee&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no control&lt;/li&gt;
&lt;li&gt;no auditability&lt;/li&gt;
&lt;li&gt;no contract&lt;/li&gt;
&lt;li&gt;no governance&lt;/li&gt;
&lt;li&gt;no trace&lt;/li&gt;
&lt;li&gt;no trade-in&lt;/li&gt;
&lt;li&gt;no clear responsibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ The NoLife Agency Model
&lt;/h2&gt;

&lt;p&gt;We introduce a strict separation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;organization (Paperclip)&lt;/strong&gt; → who does what&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;specialization (Hermes)&lt;/strong&gt; → how to think&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;orchestration (Flow)&lt;/strong&gt; → when to execute&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;traceability (Navi)&lt;/strong&gt; → observe and audit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;intelligence (Symfony AI)&lt;/strong&gt; → produce content&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧱 Technical architecture
&lt;/h2&gt;

&lt;p&gt;The application is based on a &lt;strong&gt;ports &amp;amp; adapters&lt;/strong&gt; architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Main Ports
&lt;/h3&gt;

&lt;p&gt;NoLife Agency uses ports and adapters to ensure that orchestration and governance remain decoupled from vendor/runtime specifics.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI → &lt;code&gt;AiAgentClient&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Workflow → &lt;code&gt;FlowWorkflowClient&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Trace → &lt;code&gt;NaviTraceClient&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Media → &lt;code&gt;MediaGenerationClient&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Each external dependency is isolated.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AgentRunner&lt;/code&gt; is the single boundary for execution and governance. Adapters provide functionality, but they do not enforce policy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
demoCommand[DemoClientWebsiteCommand] --&amp;gt; workflowLoader[WorkflowDefinitionLoader]
workflowLoader --&amp;gt; workflowValidator[WorkflowDefinitionValidator]
workflowValidator --&amp;gt; flowPort[FlowWorkflowClient]
flowPort --&amp;gt; agentRunner[AgentRunner]
agentRunner --&amp;gt; aiPort[AiAgentClient]
agentRunner --&amp;gt; naviPort[NaviTraceClient]
agentRunner --&amp;gt; mediaPort[MediaGenerationClient]
agentRunner --&amp;gt; auditJsonl[Audit JSONL]
agentRunner --&amp;gt; runArtifacts[Run Artifacts]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Symfony AI
  ↓
Agent Contracts + Registry
  ↓
AgentRunner + Governance
  ↓
Flow Workflow Runner
  ↓
Navi Trace Client
  ↓
Operational Reports
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧠 Key principle
&lt;/h2&gt;

&lt;p&gt;Agents are not dependent on tools. They are dependent on contracts.&lt;/p&gt;

&lt;p&gt;Result :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;testability&lt;/li&gt;
&lt;li&gt;interchangeability&lt;/li&gt;
&lt;li&gt;robustness&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚙️ The heart of the system: AgentRunner
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;AgentRunner&lt;/code&gt; is &lt;strong&gt;the central point&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;execution&lt;/li&gt;
&lt;li&gt;governance&lt;/li&gt;
&lt;li&gt;audit&lt;/li&gt;
&lt;li&gt;trace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 No agent can circumvent this point.&lt;/p&gt;

&lt;p&gt;Main guarantees:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;checks of the &lt;code&gt;pre-flight&lt;/code&gt; and &lt;code&gt;post-flight&lt;/code&gt; policy&lt;/li&gt;
&lt;li&gt;Application of approval for high-risk states/final delivery&lt;/li&gt;
&lt;li&gt;Workflow status security checks&lt;/li&gt;
&lt;li&gt;confining the artifact path to the execution directory&lt;/li&gt;
&lt;li&gt;Trace the correlation between the lifecycle and audit events&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔐 Integrated IT Governance
&lt;/h2&gt;

&lt;p&gt;Each action is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;validated&lt;/li&gt;
&lt;li&gt;traced&lt;/li&gt;
&lt;li&gt;audited&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSONL logs&lt;/li&gt;
&lt;li&gt;trace per run&lt;/li&gt;
&lt;li&gt;validation rules&lt;/li&gt;
&lt;li&gt;mandatory approval&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This is not a blind, autonomous system.&lt;br&gt;&lt;br&gt;
👉 It's a &lt;strong&gt;controlled&lt;/strong&gt; system.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;AgentRunner&lt;/code&gt; is the single point of application for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;policy checks&lt;/li&gt;
&lt;li&gt;trace the life cycle&lt;/li&gt;
&lt;li&gt;Issuance of audit events&lt;/li&gt;
&lt;li&gt;approval requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Key points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;separation of responsibilities&lt;/li&gt;
&lt;li&gt;auditability&lt;/li&gt;
&lt;li&gt;human validation&lt;/li&gt;
&lt;li&gt;limitation of risky actions&lt;/li&gt;
&lt;li&gt;typed interfaces&lt;/li&gt;
&lt;li&gt;policy tests&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🔌 Phase 3 - Typed Ports
&lt;/h2&gt;

&lt;p&gt;The dependencies become ports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Symfony AI → intelligence&lt;/li&gt;
&lt;li&gt;Flow → orchestration&lt;/li&gt;
&lt;li&gt;Navi → traceability&lt;/li&gt;
&lt;li&gt;media-bundle → media generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With one critical point:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The adapters are interchangeable via configuration&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Environment variables made available on the project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;NOLIFE_AI_ADAPTER&lt;/code&gt; (&lt;code&gt;null|symfony_ai&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NOLIFE_FLOW_ADAPTER&lt;/code&gt; (&lt;code&gt;null|darkwood_flow&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NOLIFE_NAVI_ADAPTER&lt;/code&gt; (&lt;code&gt;null|darkwood_navi&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NOLIFE_MEDIA_ADAPTER&lt;/code&gt; (&lt;code&gt;null|media_bundle&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOLIFE_FLOW_ROOT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOLIFE_NAVI_ROOT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;NOLIFE_MEDIA_BUNDLE_ROOT&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🧪 Use Case - Creating a Client Website
&lt;/h2&gt;

&lt;p&gt;Use case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client: Acme SaaS
Contact: John Do
Need: landing page + blog + SEO + short launch video
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Order :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php bin/console nolife:demo:client-website acme-saas
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lead_qualified&lt;/li&gt;
&lt;li&gt;brief_created&lt;/li&gt;
&lt;li&gt;architecture_defined&lt;/li&gt;
&lt;li&gt;ux_ready&lt;/li&gt;
&lt;li&gt;content_generated&lt;/li&gt;
&lt;li&gt;development_ready&lt;/li&gt;
&lt;li&gt;SEO optimized&lt;/li&gt;
&lt;li&gt;qa_validated&lt;/li&gt;
&lt;li&gt;media_brief_created&lt;/li&gt;
&lt;li&gt;delivery_reviewed&lt;/li&gt;
&lt;li&gt;human_approval_required&lt;/li&gt;
&lt;li&gt;published&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 We are intentionally stopping before publication.&lt;/p&gt;

&lt;p&gt;Paperclip is modeled as an organizational concept.&lt;br&gt;&lt;br&gt;
Hermès is modeled as a concept of specialization.&lt;br&gt;&lt;br&gt;
Neither is coupled as an execution service.&lt;/p&gt;
&lt;h2&gt;
  
  
  📂 Generated Outputs
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;var/nolife-agency/runs/{run_id}/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;brief.json&lt;/li&gt;
&lt;li&gt;landing-page.md&lt;/li&gt;
&lt;li&gt;article-draft.md&lt;/li&gt;
&lt;li&gt;seo-geo.md&lt;/li&gt;
&lt;li&gt;media-brief.yaml&lt;/li&gt;
&lt;li&gt;delivery-report.md&lt;/li&gt;
&lt;li&gt;trace.json&lt;/li&gt;
&lt;li&gt;audit.jsonl&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Expected final state: &lt;code&gt;human_approval_required&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  🔁 Multi-agent at all levels
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Infrastructure
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Docker / isolated services&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. Organization
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Paperclip → role structure&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Intelligence
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hermes → agent specialization&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  4. Application
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Symfony → concrete orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 NoLife Agency is a &lt;strong&gt;point of convergence&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚠️ Real problem encountered
&lt;/h2&gt;

&lt;p&gt;Today :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI adapter: null
Using Null AI adapter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 The system is correct… but not yet connected.&lt;/p&gt;

&lt;p&gt;That's normal.&lt;/p&gt;

&lt;p&gt;Because :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The ports are in place&lt;/li&gt;
&lt;li&gt;but the actual implementations are not enabled&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 What this reveals
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Building a multi-agent architecture is not the same as calling an LLM.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define contracts&lt;/li&gt;
&lt;li&gt;Isolate the dependencies&lt;/li&gt;
&lt;li&gt;Centralize governance&lt;/li&gt;
&lt;li&gt;Make the system testable&lt;/li&gt;
&lt;li&gt;Gradually activate the integrations&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🚀 Next step
&lt;/h2&gt;

&lt;p&gt;Enable :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Symfony AI (real intelligence)&lt;/li&gt;
&lt;li&gt;Flow (actual workflow)&lt;/li&gt;
&lt;li&gt;Navi (actual track)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Without breaking anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the tests&lt;/li&gt;
&lt;li&gt;governance&lt;/li&gt;
&lt;li&gt;the ports&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Multi-agent architectures are not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;magical autonomous systems&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These are :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;governed, orchestrated, and traceable software organizations&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  💡 Darkwood Positioning
&lt;/h2&gt;

&lt;p&gt;NoLife Agency is showing a clear direction:&lt;/p&gt;

&lt;p&gt;The future of AI systems is not only autonomous.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is &lt;strong&gt;governed&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🕵 Project source code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;nolife-agency: &lt;a href="https://github.com/matyo91/nolife-agency" rel="noopener noreferrer"&gt;https://github.com/matyo91/nolife-agency&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔗 Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Multi-Agent Architectures: &lt;a href="https://speakerdeck.com/chr_hertel/symfony-ai-in-action-symfonylive-berlin-2026?slide=46" rel="noopener noreferrer"&gt;https://speakerdeck.com/chr_hertel/symfony-ai-in-action-symfonylive-berlin-2026?slide=46&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;What is a multi-agent system? &lt;a href="https://www.ibm.com/fr-fr/think/topics/multiagent-system" rel="noopener noreferrer"&gt;https://www.ibm.com/fr-fr/think/topics/multiagent-system&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Multi-Agent Orchestration: How to Build Agent Teams That Actually Work: &lt;a href="https://www.mindstudio.ai/blog/multi-agent-orchestration-patterns" rel="noopener noreferrer"&gt;https://www.mindstudio.ai/blog/multi-agent-orchestration-patterns&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Building AI Teams: How Docker Sandboxes and Docker Agent Transform Development: &lt;a href="https://www.docker.com/blog/building-ai-teams-docker-sandboxes-agent/" rel="noopener noreferrer"&gt;https://www.docker.com/blog/building-ai-teams-docker-sandboxes-agent/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;How To Build a Multi-Agent AI System with Docker Agent: &lt;a href="https://www.digitalocean.com/community/tutorials/how-to-build-multi-agent-ai-system-docker-agent-digitalocean" rel="noopener noreferrer"&gt;https://www.digitalocean.com/community/tutorials/how-to-build-multi-agent-ai-system-docker-agent-digitalocean&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Langchain Multi-agent: &lt;a href="https://docs.langchain.com/oss/python/langchain/multi-agent" rel="noopener noreferrer"&gt;https://docs.langchain.com/oss/python/langchain/multi-agent&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Github NousResearch/hermes-paperclip-adapter: &lt;a href="https://github.com/NousResearch/hermes-paperclip-adapter" rel="noopener noreferrer"&gt;https://github.com/NousResearch/hermes-paperclip-adapter&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hermes Agent, how to take advantage of the OpenClaw killer: &lt;a href="https://www.youtube.com/watch?v=j7cKjTMjNLE" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=j7cKjTMjNLE&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The A-Team - AI Agents for SaaS Development: &lt;a href="https://github.com/gmoigneu/the-a-team" rel="noopener noreferrer"&gt;https://github.com/gmoigneu/the-a-team&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;New Tech Role Emerging: Product Managers might evolve to “Product CEOs” (Paul Teyssier | Front): &lt;a href="https://www.youtube.com/watch?v=J3vCkWbSYI0" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=J3vCkWbSYI0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Openai/symphony: &lt;a href="https://github.com/openai/symphony" rel="noopener noreferrer"&gt;https://github.com/openai/symphony&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎶 Music credit
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keine Freunde bleiben (feat. Mia Julia) - Matthias Reim: &lt;a href="https://vm.tiktok.com/ZNRgyxKkE/" rel="noopener noreferrer"&gt;https://vm.tiktok.com/ZNRgyxKkE/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;blockquote&gt; &lt;a title="@reim.matthias" href="https://www.tiktok.com/@reim.matthias?refer=embed" rel="noopener noreferrer"&gt;@reim.matthias&lt;/a&gt; Wenn Freundschaft keinen Sinn mehr macht… Wer fühlt den Song? &lt;a title="miajulia" href="https://www.tiktok.com/tag/miajulia?refer=embed" rel="noopener noreferrer"&gt;#miajulia&lt;/a&gt; &lt;a title="matthiasreim" href="https://www.tiktok.com/tag/matthiasreim?refer=embed" rel="noopener noreferrer"&gt;#matthiasreim&lt;/a&gt; &lt;a title="keinefreundebleben" href="https://www.tiktok.com/tag/keinefreundebleben?refer=embed" rel="noopener noreferrer"&gt;#keinefreundebleben&lt;/a&gt; &lt;a title="♬ Keine Freunde bleiben (feat. Mia Julia) - Matthias Reim" href="https://www.tiktok.com/music/Keine-Freunde-bleiben-feat-Mia-Julia-7628279460525115408?refer=embed" rel="noopener noreferrer"&gt;♬ Keine Freunde bleiben (feat. Mia Julia) - Matthias Reim&lt;/a&gt;&lt;br&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;"That way I eat more!" 😂 #nico #byilhanntwitch: &lt;a href="https://vm.tiktok.com/ZNRg5Rsh1/" rel="noopener noreferrer"&gt;https://vm.tiktok.com/ZNRg5Rsh1/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;blockquote&gt; &lt;a title="@leclippeurrapide" href="https://www.tiktok.com/@leclippeurrapide?refer=embed" rel="noopener noreferrer"&gt;@leclippeurrapide&lt;/a&gt; "That way I eat more!" 😂 &lt;a title="Nico" href="https://www.tiktok.com/tag/nico?refer=embed" rel="noopener noreferrer"&gt;#nico&lt;/a&gt; &lt;a title="byilhanntwitch" href="https://www.tiktok.com/tag/byilhanntwitch?refer=embed" rel="noopener noreferrer"&gt;#byilhanntwitch&lt;/a&gt; &lt;a title="♬ Original sound - The Fast Clipper" href="https://www.tiktok.com/music/son-original-7552578191062453014?refer=embed" rel="noopener noreferrer"&gt;♬ original sound - Le Clippeur Rapide&lt;/a&gt;&lt;br&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📖 Selection of the week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DeepSeek-R1 evolving a Game of Life pattern really feels like a breakthrough: &lt;a href="https://www.reddit.com/r/LocalLLaMA/comments/1icqzcz/deepseekr1_evolving_a_game_of_life_pattern_really/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/LocalLLaMA/comments/1icqzcz/deepseekr1_evolving_a_game_of_life_pattern_really/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Unbounded: A Generative Infinite Game of Character Life Simulation: &lt;a href="https://arxiv.org/html/2410.18975v1" rel="noopener noreferrer"&gt;https://arxiv.org/html/2410.18975v1&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LLM Interactive Story Game Architecture: &lt;a href="https://montreal.aitinkerers.org/talks/rsvp_c82tFBRQJ9A" rel="noopener noreferrer"&gt;https://montreal.aitinkerers.org/talks/rsvp_c82tFBRQJ9A&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Can an LLM Make a Video Game? &lt;a href="https://www.codemag.com/Article/2411061/Can-an-LLM-Make-a-Video-Game" rel="noopener noreferrer"&gt;https://www.codemag.com/Article/2411061/Can-an-LLM-Make-a-Video-Game&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Harness design for long-running application development: &lt;a href="https://www.anthropic.com/engineering/harness-design-long-running-apps" rel="noopener noreferrer"&gt;https://www.anthropic.com/engineering/harness-design-long-running-apps&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Elon Musk explains his 5-step algorithm for running companies: &lt;a href="https://youtu.be/tdf3luOCNks?is=L6MRoXTHzvFVIUR8" rel="noopener noreferrer"&gt;https://youtu.be/tdf3luOCNks?is=L6MRoXTHzvFVIUR8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;when you have vibe coder in your office: &lt;a href="https://x.com/javinpaul/status/2048425733694124211/video/1?s=46" rel="noopener noreferrer"&gt;https://x.com/javinpaul/status/2048425733694124211/video/1?s=46&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Sunday morning science: &lt;a href="https://x.com/Soph_astro/status/2048333972615111050/video/1?s=46" rel="noopener noreferrer"&gt;https://x.com/Soph_astro/status/2048333972615111050/video/1?s=46&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;React Native at Cdiscount with Ludwig Vantours: &lt;a href="https://www.youtube.com/watch?v=C3toh628KJE&amp;amp;list=PLmewDYeBL3XIx7Lnga-jO3eRjOsKQ-HW0&amp;amp;index=31" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=C3toh628KJE&amp;amp;list=PLmewDYeBL3XIx7Lnga-jO3eRjOsKQ-HW0&amp;amp;index=31&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Getgaal - docs(mcp): re-sync with agents/global registry resolution: &lt;a href="https://github.com/getgaal/docs/pull/16" rel="noopener noreferrer"&gt;https://github.com/getgaal/docs/pull/16&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Arize Phoenix: &lt;a href="https://arize.com/docs/phoenix" rel="noopener noreferrer"&gt;https://arize.com/docs/phoenix&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Design a new professional future with no-code and AI: &lt;a href="https://www.youtube.com/watch?v=p-sHtOut884" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=p-sHtOut884&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The bullshit of open-source AI models: &lt;a href="https://www.youtube.com/watch?v=jpg9lvtqrF8" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=jpg9lvtqrF8&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A former spy uses AI to learn everything about you (Claude Code demonstration): &lt;a href="https://www.youtube.com/watch?v=eQXMEvGRld4" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=eQXMEvGRld4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Automate your information monitoring for free and easily: &lt;a href="https://www.youtube.com/watch?v=6n_xwJ6YAj0" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=6n_xwJ6YAj0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;A man spent 50 years teaching at MIT. The most important hour you'll watch this week. &lt;a href="https://x.com/suryanshti777/status/2049187998936482069?s=46" rel="noopener noreferrer"&gt;https://x.com/suryanshti777/status/2049187998936482069?s=46&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The Fastest AI Infrastructure: &lt;a href="https://www.cerebras.ai" rel="noopener noreferrer"&gt;https://www.cerebras.ai&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Diablo® IV: Lord of Hatred: &lt;a href="https://eu.shop.battle.net/fr-fr/product/diablo-iv-lord-of-hatred" rel="noopener noreferrer"&gt;https://eu.shop.battle.net/fr-fr/product/diablo-iv-lord-of-hatred&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>🚀 Fundraising vs. Bootstrap: Two paths to building a company</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Wed, 29 Apr 2026 07:22:46 +0000</pubDate>
      <link>https://dev.to/matyo91/fundraising-vs-bootstrap-two-paths-to-building-a-company-4787</link>
      <guid>https://dev.to/matyo91/fundraising-vs-bootstrap-two-paths-to-building-a-company-4787</guid>
      <description>&lt;p&gt;On April 28th, Builders Factory and NextGen VC organized a discussion in Paris around a seemingly simple question: &lt;strong&gt;Should you raise funds or build using bootstrapping?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Face to face: &lt;strong&gt;Étienne Genvrin&lt;/strong&gt;, founder of Emma, ​​which has raised several million euros, and &lt;strong&gt;Wilfried Granier&lt;/strong&gt;, founder of Superprof, which claims impressive growth without raising funds.&lt;/p&gt;

&lt;p&gt;Two opposing paths. Two visions of entrepreneurship. And above all, one central idea: &lt;strong&gt;there is no single right way to build a business.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-29-builder-factory/resized_IMG_4659.HEIC.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-29-builder-factory/resized_IMG_4659.HEIC.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The bootstrap: building a company that reflects you
&lt;/h2&gt;

&lt;p&gt;Wilfried Granier defends a very personal vision of the company.&lt;/p&gt;

&lt;p&gt;Superprof wasn't conceived as a startup to be sold, but as a company to be held onto. This difference changes everything. When you don't raise capital, you retain the freedom to decide, to experiment, to take your time, to make choices that may not seem rational on paper, but are consistent with your intuition.&lt;/p&gt;

&lt;p&gt;The bootstrap also forces you to focus on the essentials: revenue.&lt;/p&gt;

&lt;p&gt;No artificial runway. No growth financed by successive rounds of funding. The market responds directly. If customers pay, the company moves forward. If not, it must correct course.&lt;/p&gt;

&lt;p&gt;This constraint can become a strength: it encourages creativity, efficiency, the building of a solid culture, and the search for sustainable organic levers such as SEO, community, user reviews, or gradual internationalization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fundraising: Accelerate, learn, iterate faster
&lt;/h2&gt;

&lt;p&gt;Étienne Genvrin offers another interpretation.&lt;/p&gt;

&lt;p&gt;For certain markets, particularly consumer applications or products requiring high execution speeds, raising funds can be almost essential. Funding allows for faster recruitment, more testing, and the ability to make more mistakes in less time.&lt;/p&gt;

&lt;p&gt;But he insists on one important point: raising funds is a game.&lt;/p&gt;

&lt;p&gt;This game has its rules, its codes, its expectations, its language. Many entrepreneurs fail to raise funds not because their project is bad, but because they don't yet understand how this game works.&lt;/p&gt;

&lt;p&gt;Raising funds is therefore not just a question of business model. It is also a question of narrative, timing, network, perceived ambition, and the ability to embody a credible trajectory.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real issue: alignment
&lt;/h2&gt;

&lt;p&gt;The debate could have been reduced to “raise or not raise”. But the real question is deeper:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What type of business do you really want to build?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your goal is to remain in control, to build for twenty years, to preserve maximum freedom, then the bootstrap may be the best path.&lt;/p&gt;

&lt;p&gt;If your goal is to quickly capture a market, recruit expensive profiles, and move very fast in a sector where speed counts, then fundraising can become a strategic tool.&lt;/p&gt;

&lt;p&gt;In both cases, the danger is misalignment.&lt;/p&gt;

&lt;p&gt;Raising capital when you want a flexible structure can create ongoing problems. Bootstrapping when you're operating in a market where speed is vital can condemn the project to remain too small.&lt;/p&gt;

&lt;p&gt;Advice is no substitute for instinct.&lt;/p&gt;

&lt;p&gt;One of the strongest messages of the evening: &lt;strong&gt;entrepreneurship is learned through practice&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Listening to podcasts, reading threads, or attending conferences can be inspiring. But it doesn't replace being on the ground.&lt;/p&gt;

&lt;p&gt;Entrepreneurial instinct is built by talking to customers, selling, recruiting, making mistakes, wasting time, correcting, and starting again.&lt;/p&gt;

&lt;p&gt;This is also why we must be wary of absolute advice. Advice that's true for Superprof isn't necessarily true for Emma. A strategy that works in 2013 isn't necessarily effective in 2026. A tactic that works in France might fail in the United States.&lt;/p&gt;

&lt;p&gt;The entrepreneur should not seek a universal rule. He must develop his own judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Barriers to entry are built as you move forward
&lt;/h2&gt;

&lt;p&gt;Another interesting point: at the beginning, it is often unnecessary to over-theorize about barriers to entry.&lt;/p&gt;

&lt;p&gt;When you start out, you don't yet have 39 million teachers, millions of user reviews, a well-known brand, or an international database. These advantages aren't prerequisites. They're the result of years of operation.&lt;/p&gt;

&lt;p&gt;The real initial barrier to entry is often the ability to continue when others give up.&lt;/p&gt;

&lt;p&gt;Create a first version. Find a first client. Solve a first problem. Move from level 0 to level 1.&lt;/p&gt;

&lt;p&gt;It's less spectacular than an ambitious pitch deck, but this is where the real building begins.&lt;/p&gt;

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

&lt;p&gt;Fundraising and bootstrapping are not two opposing camps.&lt;/p&gt;

&lt;p&gt;These are two different tools.&lt;/p&gt;

&lt;p&gt;The fundraising buys time, speed, and visible ambition.&lt;br&gt;
Bootstrapping buys freedom, patience, and mastery.&lt;/p&gt;

&lt;p&gt;The real issue, therefore, is not which model is superior.&lt;/p&gt;

&lt;p&gt;The real question is which one allows you to build the right business, at the right time, with the right level of alignment.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-29-builder-factory/resized_IMG_4657.HEIC.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-29-builder-factory/resized_IMG_4657.HEIC.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-29-builder-factory/resized_IMG_4658.HEIC.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-29-builder-factory/resized_IMG_4658.HEIC.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-29-builder-factory/resized_IMG_4661.HEIC.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-29-builder-factory/resized_IMG_4661.HEIC.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 I rebuilt an LLM… with pixels.</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 26 Apr 2026 15:59:27 +0000</pubDate>
      <link>https://dev.to/matyo91/i-rebuilt-an-llm-with-pixels-aoe</link>
      <guid>https://dev.to/matyo91/i-rebuilt-an-llm-with-pixels-aoe</guid>
      <description>&lt;p&gt;Large Language Models (LLMs) are based on abstract concepts:&lt;br&gt;
probability distribution, autoregressive generation, large-scale optimization.&lt;/p&gt;

&lt;p&gt;These mechanisms are difficult to observe directly.&lt;/p&gt;

&lt;p&gt;An alternative approach is to &lt;strong&gt;project these concepts into a visual and deterministic system&lt;/strong&gt;, allowing us to study their dynamics.&lt;/p&gt;

&lt;p&gt;This work is inspired by an initial demonstration shared on Twitter:&lt;br&gt;
Allen Explains thread&lt;/p&gt;

&lt;p&gt;The goal is to build an educational prototype that will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;represent a sequential generation&lt;/li&gt;
&lt;li&gt;observe an optimization process&lt;/li&gt;
&lt;li&gt;compare different training regimens&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  System Architecture
&lt;/h2&gt;

&lt;p&gt;The prototype is implemented in PHP (Symfony 8) and is based on four main components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cellular Automaton (Game of Life)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lambda language (AST JSON)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Genetic Algorithm&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Streaming pipeline (NDJSON + SSE)&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Full source code:&lt;br&gt;
llm-game-of-life&lt;/p&gt;
&lt;h2&gt;
  
  
  Representation: from text to grid
&lt;/h2&gt;

&lt;p&gt;An LLM models a distribution:&lt;/p&gt;

&lt;p&gt;[&lt;br&gt;
P(x_1, x_2, ..., x_n)&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;broken down into:&lt;/p&gt;

&lt;p&gt;[&lt;br&gt;
\prod_{t=1}^{n} P(x_t \mid x_{&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;In this prototype, this structure is transposed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;LLM&lt;/th&gt;
&lt;th&gt;Prototype&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Token&lt;/td&gt;
&lt;td&gt;Cell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sequence&lt;/td&gt;
&lt;td&gt;Grid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generation&lt;/td&gt;
&lt;td&gt;Frame&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model&lt;/td&gt;
&lt;td&gt;Program&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inference loop&lt;/td&gt;
&lt;td&gt;Simulation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Each frame corresponds to a generation step.&lt;/p&gt;

&lt;p&gt;The SSE flow produces a sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;frame₀ → frame₁ → frame₂ → …
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;equivalent to a self-regressive generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model: program rather than network
&lt;/h2&gt;

&lt;p&gt;Unlike traditional LLMs, no neural networks are used.&lt;/p&gt;

&lt;p&gt;The model is defined as a &lt;strong&gt;program in a mini lambda language&lt;/strong&gt;, represented as an AST JSON file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sequence"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"nodes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"birth"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"x"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"y"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"next"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This program acts as a transition function on the grid.&lt;/p&gt;

&lt;p&gt;This approach replaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the weights of a model → by instructions&lt;/li&gt;
&lt;li&gt;the layers → through explicit transformations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Optimization: Genetic Algorithm
&lt;/h2&gt;

&lt;p&gt;The training is based on a population of programs.&lt;/p&gt;

&lt;p&gt;Each generation follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fitness Assessment&lt;/li&gt;
&lt;li&gt;Selection&lt;/li&gt;
&lt;li&gt;Crossover&lt;/li&gt;
&lt;li&gt;Mutation&lt;/li&gt;
&lt;li&gt;Elitism&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This process replaces gradient descent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unsupervised training
&lt;/h2&gt;

&lt;p&gt;Unsupervised mode maximizes a fitness function based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;entropy (diversity)&lt;/li&gt;
&lt;li&gt;movement (variation between frames)&lt;/li&gt;
&lt;li&gt;lifetime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Objective :&lt;/p&gt;

&lt;p&gt;[&lt;br&gt;
\text{fitness} = f(\text{entropy}, \text{motion}, \text{lifetime})&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;This regimen is analogous to &lt;strong&gt;pretraining&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;absence of target&lt;/li&gt;
&lt;li&gt;exploration of the solutions space&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Supervised Training
&lt;/h2&gt;

&lt;p&gt;The supervised mode introduces a target:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;glider&lt;/li&gt;
&lt;li&gt;blinker&lt;/li&gt;
&lt;li&gt;block&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fitness is becoming:&lt;/p&gt;

&lt;p&gt;[&lt;br&gt;
\text{fitness} = -d(\text{frame}, \text{target}) + \lambda \cdot \text{penalty}&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;Or :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(d) is a distance between grids&lt;/li&gt;
&lt;li&gt;the penalty limits the size of the programs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This mode corresponds to &lt;strong&gt;fine-tuning&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preferences and selection
&lt;/h2&gt;

&lt;p&gt;A comparison mechanism can be introduced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two programs produce two sequences&lt;/li&gt;
&lt;li&gt;a preference is applied&lt;/li&gt;
&lt;li&gt;The selection favors the best&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This diagram represents a simplification of &lt;strong&gt;RLHF / DPO&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;[&lt;br&gt;
\max \log P(\text{preferred}) - \log P(\text{rejected})&lt;br&gt;
]&lt;/p&gt;

&lt;h2&gt;
  
  
  Generation and streaming
&lt;/h2&gt;

&lt;p&gt;The results are produced in NDJSON and disseminated via SSE:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each chunk = one frame&lt;/li&gt;
&lt;li&gt;Each stream = one generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Canvas-based visualization interface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;matrix rendering&lt;/li&gt;
&lt;li&gt;real-time display&lt;/li&gt;
&lt;li&gt;metrics (fitness, generation, seed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Presentation slides:&lt;br&gt;
Slidewire presentation&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmark and reproducibility
&lt;/h2&gt;

&lt;p&gt;The system includes a benchmark pipeline:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deterministic seed&lt;/li&gt;
&lt;li&gt;double execution&lt;/li&gt;
&lt;li&gt;sequence hash&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Metrics:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;duration (&lt;code&gt;duration_ms&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;memory (&lt;code&gt;peak_memory_mb&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;final fitness&lt;/li&gt;
&lt;li&gt;reproducibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Boundaries
&lt;/h2&gt;

&lt;p&gt;This prototype is not intended to reproduce a real LLM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no transformer&lt;/li&gt;
&lt;li&gt;no tokenization&lt;/li&gt;
&lt;li&gt;no probabilistic model&lt;/li&gt;
&lt;li&gt;no gradient&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a &lt;strong&gt;computational analogy&lt;/strong&gt;, useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;observe an optimization dynamic&lt;/li&gt;
&lt;li&gt;visualize a sequential generation&lt;/li&gt;
&lt;li&gt;compare different learning regimes&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Modern LLMs rely on mechanisms that are difficult to grasp directly.&lt;/p&gt;

&lt;p&gt;Transposing this into a visual system allows us to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;make generation observable&lt;/li&gt;
&lt;li&gt;to materialize the optimization&lt;/li&gt;
&lt;li&gt;isolate the fundamental concepts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach does not replace existing models, but offers a &lt;strong&gt;conceptual exploration tool&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Source of the Twitter post: &lt;a href="https://x.com/allen_explains/status/2044757995549319172?s=12" rel="noopener noreferrer"&gt;https://x.com/allen_explains/status/2044757995549319172?s=12&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The project's source code: &lt;a href="https://github.com/matyo91/llm-game-of-life" rel="noopener noreferrer"&gt;https://github.com/matyo91/llm-game-of-life&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The presentation slides: &lt;a href="https://github.com/matyo91/slidewire" rel="noopener noreferrer"&gt;https://github.com/matyo91/slidewire&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What are the principles we can use to build LLM-powered software that is actually good enough to put in the hands of production customers? &lt;a href="https://github.com/humanlayer/12-factor-agents" rel="noopener noreferrer"&gt;https://github.com/humanlayer/12-factor-agents&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AIE Miami Keynote &amp;amp; Talks ft. OpenCode. Google Deepmind, OpenAI, and more! : &lt;a href="https://www.youtube.com/watch?v=6IxSbMhT7v4" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=6IxSbMhT7v4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AIE Miami Day 2 ft. Cerebras, OpenCode, Cursor, Arize AI, and more! : &lt;a href="https://www.youtube.com/watch?v=DeM_u2Ik0sk" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=DeM_u2Ik0sk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;How AI is transforming software engineering: a conversation with Gergely Orosz, @pragmaticengineer: &lt;a href="https://www.youtube.com/watch?v=CS5Cmz5FssI" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=CS5Cmz5FssI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Microsoft at ICLR 2026: Deep Learning, LLM Reasoning, Generative Models: &lt;a href="https://www.linkedin.com/pulse/microsoft-iclr-2026-deep-learning-llm-reasoning-generative-h74se/" rel="noopener noreferrer"&gt;https://www.linkedin.com/pulse/microsoft-iclr-2026-deep-learning-llm-reasoning-generative-h74se/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ASUS DGX Spark: KI auf dem Schreibtisch – Nie wieder Token‑Kosten! | Live Modellvergleich: &lt;a href="https://www.youtube.com/watch?v=dP4zE-DTWAg" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=dP4zE-DTWAg&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🟣 [VIRTUAL SUMMIT DAY 1/5] How to outperform 99% of people using AI: &lt;a href="https://www.youtube.com/watch?v=yzhg9Ks859I" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=yzhg9Ks859I&lt;/a&gt;
Ready to launch your own agent? : &lt;a href="https://hermes-agent.org/fr/" rel="noopener noreferrer"&gt;https://hermes-agent.org/fr/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;PaperClip + Agent Hermès, it's insane! : &lt;a href="https://www.youtube.com/watch?v=PUaZ5o8u0wY" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=PUaZ5o8u0wY&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;30-minute workshop by the creator of Claude Code that will teach you more about vibe-coding: &lt;a href="https://x.com/heyamit_/status/2046489651775713498?s=46" rel="noopener noreferrer"&gt;https://x.com/heyamit_/status/2046489651775713498?s=46&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;What Young People Expect from HR: Why the Generational Approach is a Misleading Concept: &lt;a href="https://www.insign.fr/en/insights/young-workforce-expectations-generational-approach-an-intellectual-scam" rel="noopener noreferrer"&gt;https://www.insign.fr/en/insights/young-workforce-expectations-generational-approach-an-intellectual-scam&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>🤖 Symfony AI in Action - Building real AI systems with Symfony</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Fri, 24 Apr 2026 14:25:23 +0000</pubDate>
      <link>https://dev.to/matyo91/symfony-ai-in-action-building-real-ai-systems-with-symfony-47nm</link>
      <guid>https://dev.to/matyo91/symfony-ai-in-action-building-real-ai-systems-with-symfony-47nm</guid>
      <description>&lt;p&gt;For two days, on April 23 and 24, 2026, the &lt;strong&gt;SymfonyLive Berlin&lt;/strong&gt; conference brought the community together around the major developments of the Symfony ecosystem.&lt;/p&gt;

&lt;p&gt;Among the talks, one in particular marks a turning point:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Symfony AI in Action&lt;/strong&gt;, presented by Christopher Hertel.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎥 Slides: &lt;a href="https://speakerdeck.com/chr_hertel/symfony-ai-in-action-symfonylive-berlin-2026" rel="noopener noreferrer"&gt;https://speakerdeck.com/chr_hertel/symfony-ai-in-action-symfonylive-berlin-2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🧠 Symfony AI: &lt;a href="https://ai.symfony.com" rel="noopener noreferrer"&gt;https://ai.symfony.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🛠️ Platform used for this article: &lt;a href="https://slidewire.dev" rel="noopener noreferrer"&gt;https://slidewire.dev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article does not summarize the conference.&lt;br&gt;
He offers a &lt;strong&gt;Darkwood&lt;/strong&gt; interpretation of what is happening.&lt;/p&gt;
&lt;h2&gt;
  
  
  The real issue: stop thinking “chatbot”
&lt;/h2&gt;

&lt;p&gt;Today, many AI integrations are limited to this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;write a prompt → call a template → display a response&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's insufficient.&lt;/p&gt;

&lt;p&gt;The real problem, in production, lies elsewhere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;orchestrate multiple models&lt;/li&gt;
&lt;li&gt;manage context and memory&lt;/li&gt;
&lt;li&gt;Expose actions (tools)&lt;/li&gt;
&lt;li&gt;monitor costs and logs&lt;/li&gt;
&lt;li&gt;integrate everything into a business architecture&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Symfony AI does not offer a chatbot.&lt;br&gt;
👉 Symfony AI offers a &lt;strong&gt;complete stack&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Symfony AI: a stack, not a feature
&lt;/h2&gt;

&lt;p&gt;The objective is clear:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;“Enable AI features, not only LLMs.”&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Symfony AI introduces several fundamental building blocks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Platform&lt;/strong&gt; → model abstraction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent&lt;/strong&gt; → LLM loop + tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store&lt;/strong&gt; → embeddings &amp;amp; RAG&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Bundle&lt;/strong&gt; → Symfony integration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Bundle / SDK&lt;/strong&gt; → tools exhibition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 We're moving from an API call… to a &lt;strong&gt;complete AI architecture&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Platform: Model abstraction
&lt;/h2&gt;

&lt;p&gt;First classic problem:&lt;/p&gt;

&lt;p&gt;OpenAI, Claude, Gemini, Mistral → Different APIs&lt;/p&gt;

&lt;p&gt;Symfony AI introduces a unique abstraction.&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="nv"&gt;$platform&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'gpt-5-mini'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same code, different providers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this is key
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;change model without refactoring&lt;/li&gt;
&lt;li&gt;optimize costs&lt;/li&gt;
&lt;li&gt;fallback multi-provider&lt;/li&gt;
&lt;li&gt;Integrate local and remote&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Symfony becomes a &lt;strong&gt;model orchestration layer&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Streaming &amp;amp; multimodal
&lt;/h2&gt;

&lt;p&gt;Symfony AI goes beyond simple text:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real-time token streaming&lt;/li&gt;
&lt;li&gt;audio, image, PDF&lt;/li&gt;
&lt;li&gt;binary output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;analyze a PDF&lt;/li&gt;
&lt;li&gt;Describe an image&lt;/li&gt;
&lt;li&gt;process an audio&lt;/li&gt;
&lt;li&gt;generate files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 AI is becoming a &lt;strong&gt;multimodal application building block&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structured Output: regaining control
&lt;/h2&gt;

&lt;p&gt;Classic problem:&lt;/p&gt;

&lt;p&gt;LLMs return text… not reliable data&lt;/p&gt;

&lt;p&gt;Symfony AI introduces typed responses:&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="nv"&gt;$response_format&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;MyDTO&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;usable PHP objects&lt;/li&gt;
&lt;li&gt;strict validation&lt;/li&gt;
&lt;li&gt;Direct integration into the profession&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 We are moving from “generated text” to &lt;strong&gt;controlled data&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent: Connect the LLM to your application
&lt;/h2&gt;

&lt;p&gt;An agent is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a model that can call your code&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With Symfony AI:&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="na"&gt;#[AsTool('create_recipe')]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You present your profession as a tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  What this changes
&lt;/h3&gt;

&lt;p&gt;Before :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Isolated LLM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;LLM + access to your system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 AI becomes &lt;strong&gt;executable&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human in the loop: security
&lt;/h2&gt;

&lt;p&gt;A critical point that is often overlooked:&lt;/p&gt;

&lt;p&gt;An AI shouldn't do everything automatically.&lt;/p&gt;

&lt;p&gt;Symfony AI allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;intercept a tool call&lt;/li&gt;
&lt;li&gt;request validation&lt;/li&gt;
&lt;li&gt;block or allow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;publish an article&lt;/li&gt;
&lt;li&gt;trigger critical action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 You remain in control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Memory: contextualize
&lt;/h2&gt;

&lt;p&gt;Agents do not function without context.&lt;/p&gt;

&lt;p&gt;Symfony AI allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inject user data&lt;/li&gt;
&lt;li&gt;manage profiles&lt;/li&gt;
&lt;li&gt;store history&lt;/li&gt;
&lt;li&gt;control permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 AI is becoming &lt;strong&gt;contextual and personalized&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Store &amp;amp; RAG: Connect your data
&lt;/h2&gt;

&lt;p&gt;Pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;loading&lt;/li&gt;
&lt;li&gt;Filtering&lt;/li&gt;
&lt;li&gt;transforming&lt;/li&gt;
&lt;li&gt;Vectorizing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 You are building a vector basis.&lt;/p&gt;

&lt;p&gt;Afterwards :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user request&lt;/li&gt;
&lt;li&gt;search in the store&lt;/li&gt;
&lt;li&gt;enrichment of the prompt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This is &lt;strong&gt;RAG (Retrieval Augmented Generation)&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real Impact
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Smart FAQ&lt;/li&gt;
&lt;li&gt;industry search engine&lt;/li&gt;
&lt;li&gt;internal co-pilot&lt;/li&gt;
&lt;li&gt;documented assistant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 You connect the AI ​​to &lt;strong&gt;your business knowledge&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-agent: specialization
&lt;/h2&gt;

&lt;p&gt;Advanced architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;senior agent&lt;/li&gt;
&lt;li&gt;specialized sub-agents&lt;/li&gt;
&lt;li&gt;orchestration&lt;/li&gt;
&lt;li&gt;sharing or isolation of context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;support agent&lt;/li&gt;
&lt;li&gt;technical agent&lt;/li&gt;
&lt;li&gt;billing agent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Each agent has a role.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP: Expose your system
&lt;/h2&gt;

&lt;p&gt;Symfony AI is part of a broader movement:&lt;/p&gt;

&lt;p&gt;👉 the MCP protocol&lt;/p&gt;

&lt;p&gt;Objective :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Showcase your tools&lt;/li&gt;
&lt;li&gt;make your system queryable&lt;/li&gt;
&lt;li&gt;standardize AI interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Your application becomes an &lt;strong&gt;intelligence server&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real turning point: orchestration
&lt;/h2&gt;

&lt;p&gt;The most important point is not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the models&lt;/li&gt;
&lt;li&gt;the prompts&lt;/li&gt;
&lt;li&gt;the agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 The real issue is &lt;strong&gt;orchestration&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Key questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who calls what?&lt;/li&gt;
&lt;li&gt;In what context?&lt;/li&gt;
&lt;li&gt;Under what permissions?&lt;/li&gt;
&lt;li&gt;With what traceability?&lt;/li&gt;
&lt;li&gt;How to regain control?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Darkwood Approach
&lt;/h2&gt;

&lt;p&gt;At Darkwood, the answer is clear:&lt;/p&gt;

&lt;h3&gt;
  
  
  Suggested Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Symfony AI&lt;/strong&gt; → AI building blocks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; → tools exposure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flow&lt;/strong&gt; → orchestration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Navi&lt;/strong&gt; → execution + tracing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uniflow&lt;/strong&gt; → interface&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why this stack
&lt;/h3&gt;

&lt;p&gt;Symfony AI provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the models&lt;/li&gt;
&lt;li&gt;the agents&lt;/li&gt;
&lt;li&gt;the tools&lt;/li&gt;
&lt;li&gt;the RAG&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But something is missing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;business orchestration&lt;/li&gt;
&lt;li&gt;overall control&lt;/li&gt;
&lt;li&gt;full visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This is where Flow and Navi come in.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this changes in practice
&lt;/h2&gt;

&lt;p&gt;Before :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;isolated AI scripts&lt;/li&gt;
&lt;li&gt;fragile prompts&lt;/li&gt;
&lt;li&gt;little control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;orchestrated system&lt;/li&gt;
&lt;li&gt;traceable execution&lt;/li&gt;
&lt;li&gt;integrated business logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 We are moving from “playing with AI” to &lt;strong&gt;building reliable systems&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;Symfony AI marks a major evolution:&lt;/p&gt;

&lt;p&gt;You're no longer building a chatbot&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;you build a &lt;strong&gt;complete AI feature&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Today you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an abstraction of models&lt;/li&gt;
&lt;li&gt;agents connected to your code&lt;/li&gt;
&lt;li&gt;a memory system&lt;/li&gt;
&lt;li&gt;of the integrated RAG&lt;/li&gt;
&lt;li&gt;a basis for orchestrating&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 You have no more excuses.&lt;/p&gt;

&lt;h2&gt;
  
  
  To go further
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Symfony AI: &lt;a href="https://ai.symfony.com" rel="noopener noreferrer"&gt;https://ai.symfony.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Slides by Christopher Hertel: &lt;a href="https://speakerdeck.com/chr_hertel/symfony-ai-in-action-symfonylive-berlin-2026" rel="noopener noreferrer"&gt;https://speakerdeck.com/chr_hertel/symfony-ai-in-action-symfonylive-berlin-2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The technical support that allowed me to generate the slides - Slidewire: &lt;a href="https://slidewire.dev" rel="noopener noreferrer"&gt;https://slidewire.dev&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Darkwood
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://navi.darkwood.com" rel="noopener noreferrer"&gt;Navi&lt;/a&gt; → execution &amp;amp; tracing&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://flow.darkwood.com" rel="noopener noreferrer"&gt;Flow&lt;/a&gt; → orchestration&lt;/li&gt;
&lt;li&gt;Uniflow → interface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Articles coming soon with concrete implementations.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🐳 AI Tinkerers Paris Agentic Workflows with Docker - towards autonomous, secure and orchestrated systems</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Wed, 22 Apr 2026 04:00:48 +0000</pubDate>
      <link>https://dev.to/matyo91/ai-tinkerers-paris-agentic-workflows-with-docker-towards-autonomous-secure-and-orchestrated-c01</link>
      <guid>https://dev.to/matyo91/ai-tinkerers-paris-agentic-workflows-with-docker-towards-autonomous-secure-and-orchestrated-c01</guid>
      <description>&lt;p&gt;During this meetup organized by GitGuardian and sponsored by Docker, several speakers shared their vision of modern agentic systems.&lt;/p&gt;

&lt;p&gt;The goal is clear: to move from simple AI assistants to true &lt;strong&gt;autonomous agents capable of acting, collaborating and executing in production&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎤 Introduction - Security &amp;amp; Context (GitGuardian)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4602.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4602.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The evening begins in the Paris offices of &lt;strong&gt;GitGuardian&lt;/strong&gt;, which reminds us of a point often underestimated in discussions around AI agents: before even talking about autonomy, we must talk about &lt;strong&gt;access security&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The message is simple. Secrets are everywhere: API keys, JWTs, tokens, credentials, or any information capable of granting access to a resource, service, or infrastructure. In a context where agents increasingly interact with code, repositories, collaborative tools, or connected systems, the detection and control of these secrets becomes a critical layer.&lt;/p&gt;

&lt;p&gt;GitGuardian is positioned precisely in this area: helping developers, security teams and infrastructure profiles to &lt;strong&gt;identify exposed secrets&lt;/strong&gt; in their environments, whether it be Git repositories, collaborative platforms like Slack or other surfaces where sensitive information may leak.&lt;/p&gt;

&lt;p&gt;Another interesting signal emerges from this introduction: &lt;strong&gt;agent security is no longer a theoretical subject&lt;/strong&gt;. It is becoming a concrete market need, to the point of accompanying a phase of active growth at GitGuardian, which indicates it is recruiting for several profiles, including &lt;strong&gt;software engineers&lt;/strong&gt; and &lt;strong&gt;AI engineers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👉 Key point:&lt;/p&gt;

&lt;p&gt;Agents should never expose sensitive secrets without strict controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  🥽 Speakers
&lt;/h2&gt;

&lt;p&gt;The quality of this evening also stems from its lineup. Rather than presenting purely theoretical profiles, the event brought together speakers directly involved in building tools, runtimes and infrastructures related to agentic workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sébastien Blanc - making agents truly deployable
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.linkedin.com/in/sebastienblanc" rel="noopener noreferrer"&gt;&lt;strong&gt;Sébastien Blanc&lt;/strong&gt;&lt;/a&gt;, Technical Director at &lt;strong&gt;Sciam&lt;/strong&gt;, presented &lt;strong&gt;SAIL: Serverless Agentic Containers&lt;/strong&gt;, a distributed execution-oriented approach where agents are no longer conceived as simple local assistants, but as workloads capable of running in a serverless environment. His presentation naturally extends the discussions on Kubernetes, Knative, and event-driven architectures, with a fundamental question: how to build robust, scalable, and resource-efficient agentic systems?&lt;/p&gt;

&lt;h3&gt;
  
  
  Philippe Charrière - exploring the limits and potential of tiny LLMs
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://linkedin.com/in/phcharriere" rel="noopener noreferrer"&gt;&lt;strong&gt;Philippe Charrière&lt;/strong&gt;&lt;/a&gt;, Principal Solutions Architect at &lt;strong&gt;Docker&lt;/strong&gt;, presented a session entitled &lt;strong&gt;Compose and Dragons: Tiny LLMs&lt;/strong&gt;, undoubtedly one of the most experimental of the evening. His approach was particularly interesting: demonstrating that small, local models are not merely technical curiosities, but can serve as the foundation for multi-agent systems, provided their memory, performance, and orchestration constraints are accepted. His work highlights a possible future where agents rely not only on large, remote models, but also on local, specialized, and composable building blocks.&lt;/p&gt;

&lt;h3&gt;
  
  
  David Gageot - simplifying agent creation
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://linkedin.com/in/davidgageot" rel="noopener noreferrer"&gt;&lt;strong&gt;David Gageot&lt;/strong&gt;&lt;/a&gt;, Senior Principal Software Engineer at &lt;strong&gt;Docker&lt;/strong&gt;, spoke on &lt;strong&gt;Docker Agent: No-Code AI Agents&lt;/strong&gt;. His presentation focused on radical simplification: reducing the friction between the idea of ​​an agent and its concrete implementation. The value of his presentation lies not only in the "no-code" aspect, but also in the ability to make agents more accessible, more declarative, and easier to integrate into real-world workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Guillaume Lours - securing autonomy
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://linkedin.com/in/guillaumelours" rel="noopener noreferrer"&gt;&lt;strong&gt;Guillaume Lours&lt;/strong&gt;&lt;/a&gt;, Staff Software Engineer at &lt;strong&gt;Docker&lt;/strong&gt;, presented &lt;strong&gt;Docker Sandboxes&lt;/strong&gt;, probably one of the most strategic topics of the evening. While many discussions around agents focus on models or prompts, his presentation puts the runtime back at the center: if an agent is to act, it must be isolated, observable, and governable. Docker sandboxes provide a very concrete solution to questions of secure execution, network permissions, secrets, and access control.&lt;/p&gt;

&lt;h3&gt;
  
  
  Djordje Lukic - think of the agent as a system, not as a gadget
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://twitter.com/rumpl" rel="noopener noreferrer"&gt;&lt;strong&gt;Djordje Lukic&lt;/strong&gt;&lt;/a&gt;, Principal Software Engineer at &lt;strong&gt;Docker&lt;/strong&gt;, shares a presentation on &lt;strong&gt;Docker Agent&lt;/strong&gt; with David Gageot. His contribution is significant as he situates the topic within a broader discussion on agentic frameworks. Beyond the promise of “easy-to-create” agents, there is a more structural ambition: to provide a framework where models, tools, instructions, and orchestration can be neatly assembled, with a true engineering logic behind them.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 David Gageot - Djordje Lukic - Docker Agents - from assistant to true agent runtime
&lt;/h2&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4609.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4609.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Docker segment opens with &lt;strong&gt;Georgi&lt;/strong&gt; and his team, who present &lt;strong&gt;Docker Agent&lt;/strong&gt; not as just another assistant, but as what they themselves call a &lt;strong&gt;“Swiss Army Knife” of agentic frameworks&lt;/strong&gt;. The idea is quite clear: to move beyond the ad-hoc use of the model and into a logic where AI becomes a fully-fledged execution component. Their starting point is not theoretical. They explain that Docker has been working on these topics for nearly two years, particularly around &lt;strong&gt;Gordon&lt;/strong&gt;, the assistant integrated into Docker Desktop, and that Docker Agents is now used internally to build and evolve its own tools. &lt;/p&gt;

&lt;p&gt;What immediately stands out is the desire to make agents &lt;strong&gt;configurable, composable, and usable in real-world conditions&lt;/strong&gt;. Docker Agents can connect to various models, local or remote, integrate with diverse tools, and, most importantly, be described very lightweightly in &lt;strong&gt;YAML&lt;/strong&gt;, without systematically requiring a complex implementation. This is one of the demo's strongest messages: getting started with agentics doesn't necessarily begin with a cumbersome SDK or a distributed architecture, but sometimes with a simple, clear declarative definition that produces useful behavior. &lt;/p&gt;

&lt;p&gt;The first demonstration deliberately plays on something absurd—a hacker agent—to show how low the barrier to entry is. With a template and an instruction, the team already has an exploitable agent. The demonstration is lighthearted, almost mocking, but the subtext is important: &lt;strong&gt;an agent doesn't need a huge infrastructure to exist; it primarily needs a clear execution framework.&lt;/strong&gt; From there, Docker can scale it into something much more serious. &lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4616.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4616.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is precisely what happens in the second part, which is much more technically compelling. The team demonstrates how to connect an existing API to an agent using its &lt;strong&gt;OpenAPI&lt;/strong&gt; definition. In their example, it's a Pokémon API—used as a deliberately playful substitute for a more traditional business API—but the message is clear: in a corporate environment, it would be possible to use the exact same mechanism to connect internal services, knowledge bases, or specialized tools. The OpenAPI specification is transformed into a set of tools, and the agent can then query the system without the user having to directly manipulate the endpoints. It's no longer the human navigating the API; the agent handles the mediation. &lt;/p&gt;

&lt;p&gt;The demo also highlights an often underestimated architectural point: &lt;strong&gt;the question isn't just about giving an agent tools, but about giving it the right tools.&lt;/strong&gt; During the Q&amp;amp;A session, the team acknowledged that an overloaded agent quickly becomes ineffective. Even if an OpenAPI specification can expose dozens or even hundreds of tools, it's better to filter them heavily and keep only a subset that's relevant to the task. The key idea here isn't "more tools = better agent," but almost the opposite: &lt;strong&gt;a specialized agent works best with a limited, readable, and intentionally defined scope.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;The most interesting part comes next with the more advanced use cases. Docker Agents isn't limited to a single-agent approach handling a few API calls. The team demonstrates a multi-layered system, with a main agent, dedicated commands, and then &lt;strong&gt;sub-agents&lt;/strong&gt;, each with its own role, instructions, model, and potentially its own tools. The interactive quiz and the Pokémon battle simulation primarily serve to illustrate a broader idea: &lt;strong&gt;useful agentics relies less on a single “super-agent” than on an orchestration of clearly separated responsibilities&lt;/strong&gt;. The root agent coordinates, the sub-agents execute, and each operates within a more clearly defined context. &lt;/p&gt;

&lt;p&gt;The answers provided during the Q&amp;amp;A session reinforce this point. Docker distinguishes, in particular, two forms of inter-agent interaction: on the one hand, &lt;strong&gt;sub-agents&lt;/strong&gt;, which receive a task with a new context; on the other hand, &lt;strong&gt;handoff&lt;/strong&gt; mechanisms, where the conversation can switch from one agent to another. The team also mentions the possibility of sharing certain memory or to-do tools between several agents. Here again, we find a structuring idea: agentics becomes interesting when it ceases to be solely conversational and becomes &lt;strong&gt;organizational&lt;/strong&gt;. We are no longer simply asking a model to respond; we are distributing work among several specialized entities. &lt;/p&gt;

&lt;h2&gt;
  
  
  🔐 Guillaume Lours - Docker Sandboxes - giving autonomy without relinquishing control
&lt;/h2&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4619.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4619.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The second part perfectly complements the first. After demonstrating how to build agents, the Docker team poses the real question: &lt;strong&gt;where and how should they operate?&lt;/strong&gt; This is where the demonstration of &lt;strong&gt;Docker Sandboxes&lt;/strong&gt; comes in. The initial observation is very concrete: as long as an agent needs to read files, install dependencies, run commands, or access the network, it becomes impossible to run it reliably directly on the host machine without accepting an excessively high level of risk. The presenter states it very clearly: granting this level of access to an agent on your laptop is out of the question. &lt;/p&gt;

&lt;p&gt;Docker's proposed solution is an isolated execution environment in the form of a &lt;strong&gt;micro-VM&lt;/strong&gt;, containing its own Docker engine, within which runs a container hosting the agent. This represents a significant shift in perspective. The challenge is not simply to "restrict" the agent, but to create a framework that, on the contrary, grants it &lt;strong&gt;greater autonomy&lt;/strong&gt;, while still allowing the ability to observe, filter, and interrupt its actions. The goal, therefore, is not to render the agent harmless by blocking it entirely, but to give it enough freedom to truly function within clearly defined boundaries. &lt;/p&gt;

&lt;p&gt;The demonstration is compelling: in a simple web project, the agent can independently install the necessary dependencies, launch build commands, and execute tests, even when this involves operations that one wouldn't readily accept on their personal machine. The key advantage isn't just technical isolation; it's also visibility. Sandboxes expose an interface that allows users to list running environments, inspect active processes, observe network traffic generated by the agent, and, more broadly, understand what it's actually doing. Therefore, delegation isn't blind; it's delegation within an instrumented environment. &lt;/p&gt;

&lt;p&gt;Network management is probably the most compelling aspect of this section. Docker demonstrates several network policy modes, ranging from outright denial to a much more permissive openness, with a balanced intermediate option. Crucially, the interest lies not so much in the names of the modes as in the granularity they subsequently enable. Blocked access can be visualized in the sandbox's network logs and then explicitly granted. This transforms the agent's network behavior into an &lt;strong&gt;observable and adjustable policy&lt;/strong&gt;, rather than a global permission granted once and for all. In other words, access to the web or a specific domain is no longer based on implicit trust, but on an explicit decision. &lt;/p&gt;

&lt;p&gt;The same logic applies to secrets. Here too, Docker takes an interesting approach: secrets are not simply “visible” in the agent's environment as they would be on a misconfigured machine. They are injected when the sandbox is created, with a global or specific scope depending on the need. This detail is truly important in production: it means that an agent should not inherit everything on the development machine by default. It only operates with what has been provided to it in its controlled environment. In practice, this makes secrets an &lt;strong&gt;explicitly provisioned resource&lt;/strong&gt;, and not a side effect of the user session. &lt;/p&gt;

&lt;p&gt;The port exposure demo illustrates this point. An application can run in the sandbox without being immediately visible from the outside. To access it, the relevant port must be published; if it's removed, the application continues to exist in its isolated environment but becomes inaccessible from the outside. Here again, Docker demonstrates a clear separation between &lt;strong&gt;execution&lt;/strong&gt; and &lt;strong&gt;exposure&lt;/strong&gt;, which is precisely what's missing in many overly hasty agentic demos. &lt;/p&gt;

&lt;p&gt;Finally, the demonstration concludes with a particularly interesting case for modern workflows: multiple agents working on the same source code, but without interfering with each other. The proposed approach relies on the automatic creation of separate branches or worktrees, so that each agent can operate in its own workspace. This part is important because it shows that Docker doesn't just think of the agent as an individual assistant, but also as a &lt;strong&gt;parallel actor in a collaborative development flow&lt;/strong&gt;. The agent is no longer just there to respond, but to take over part of the work in a controlled, isolated, and potentially concurrent space. &lt;/p&gt;

&lt;p&gt;The implicit conclusion of this sequence is undoubtedly the most useful of the entire evening:&lt;/p&gt;

&lt;p&gt;The real issue is not preventing agents from acting, but building the environment in which they can act properly.&lt;/p&gt;

&lt;p&gt;In other words, useful autonomy doesn't stem from blind trust, but from a well-designed runtime: isolation, granular network policies, controlled injection of secrets, observability, and separation of workspaces. This is probably where Docker's approach becomes most compelling for stacks like Darkwood, Flow, or any architecture seeking to move agents from the "demo" stage to the "system" stage. &lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Philippe Charrière - Local models, between promise and memory pressure
&lt;/h2&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4624.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4624.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Philippe Charrière's presentation, the evening shifted its focus from agentic frameworks to something much more concrete: the actual cost of running a model locally. His presentation had the merit of bringing the topic back down to the level of the machine, RAM, and technical trade-offs. Behind the enthusiasm surrounding "small models," his observation was simple: yes, local models are interesting, but as soon as you want to do more than a minimal demo, the dominant constraint immediately becomes that of resources, especially on Macs. &lt;/p&gt;

&lt;p&gt;The main point of friction, in his experience, isn't so much Docker itself as the &lt;strong&gt;memory pressure&lt;/strong&gt; generated by the templates. On his machine—a &lt;strong&gt;MacBook Pro M2 Max with 32 GB of RAM&lt;/strong&gt;—a template might seem to "hold up" in theory, then become unusable in practice as soon as it's actually queried. Philippe emphasizes an important detail: a compatibility estimate isn't always a guarantee of comfortable use. A template might start, respond once, then quickly degrade the machine as soon as the load increases. And if you add a second, different template, or simply more requests, the situation deteriorates even faster. His real-world experience is almost brutally simple: for a long time, what he thought was a Docker problem was actually a &lt;strong&gt;memory issue&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;His demonstration was based on a relatively straightforward stack: Docker Model Runner, Docker Compose, and a set of local models used as building blocks for a larger system. During the Q&amp;amp;A session, he explained that Docker Model Runner currently relies on engines like llama.cpp and vLLM, with the possibility of future integration with MLX. He also clearly distinguished between different use cases: vLLM seemed better suited for production, while llama.cpp remained more relevant for local or experimental use. Again, the key point is not to promote a single, overarching backend, but to recognize that the model runtime is itself an architectural issue. &lt;/p&gt;

&lt;p&gt;But the presentation isn't just a simple warning about RAM. Philippe also demonstrates what can be built despite these constraints, provided one is willing to work with &lt;strong&gt;small, specialized, and local models&lt;/strong&gt;. His example takes the form of a text-based game project, a kind of dungeon crawler orchestrated by several components. This choice might seem playful, but it primarily serves to showcase an interesting architecture: an &lt;strong&gt;MCP server&lt;/strong&gt; to manage the dungeon, rooms, monsters, and rules; a &lt;strong&gt;Dungeon Master&lt;/strong&gt; as the main agent; several &lt;strong&gt;NPC agents&lt;/strong&gt; exposing their own APIs; and a final boss that also functions as a fully autonomous entity. This is no longer a simple prompting demo, but an attempt at multi-component simulation, where each role has its own scope of action.&lt;/p&gt;

&lt;p&gt;What makes this section particularly useful is that it shows that local models aren't just a matter of cost or sovereignty. They imply a different way of thinking about the system. Philippe explains, for example, that he reuses the &lt;strong&gt;same model for multiple agents&lt;/strong&gt; to avoid memory overload, rather than multiplying heterogeneous instances. This approach is important: in a constrained environment, good design doesn't necessarily consist of choosing the best model for each agent, but sometimes of designing the entire workflow around an acceptable hardware compromise. The system must then be designed based on the available machine, not just the ideal functionality. &lt;/p&gt;

&lt;p&gt;His “Compose and Dragons” project perfectly illustrates this logic. The dungeon map is generated in advance, and other components then enrich the experience with descriptions, NPCs, and interactions. All of this relies on an orchestration combining local models, Docker services, and specialized agents. It's not yet a demonstration of industrial robustness, but it's an interesting proof of concept: even with limited resources, it's possible to create a relatively rich, autonomous system, provided you accept its limitations in latency, memory, and complexity. Philippe himself states this frankly during the demo: on small models, some interactions remain slow, some transitions fail, and the system still requires adjustments. This is precisely what makes the feedback credible.&lt;/p&gt;

&lt;p&gt;Finally, a more subtle but very useful point emerged at the end of the discussion: this local architecture can also be &lt;strong&gt;combined with Docker sandboxes&lt;/strong&gt;, provided that the correct ports are explicitly opened to connect to the model runner from the isolated environment. Here again, we find the central theme of the entire evening: agents, models, and tools are only as good as the runtime that connects them correctly. Local models are therefore not a “simple” alternative to the cloud; they simply shift the problem to another level, where a trade-off must be made between autonomy, performance, memory, and execution architecture. &lt;/p&gt;

&lt;p&gt;In summary, Philippe Charrière's demonstration reminds us of one essential thing:&lt;/p&gt;

&lt;p&gt;Local models are useful, but they do not eliminate complexity; they simply make it more visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  ☸️ Sébastien Blanc - Production Agents - Kubernetes &amp;amp; Knative
&lt;/h2&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4630.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4630.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The latest intervention clearly shifts towards a &lt;strong&gt;production-ready&lt;/strong&gt; approach. After agents, models, and sandboxes, the question becomes simple:&lt;/p&gt;

&lt;p&gt;Where and how can these systems be scaled up?&lt;/p&gt;

&lt;p&gt;The proposed answer is straightforward: &lt;strong&gt;Java + Kubernetes + Knative&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 A deliberate stack
&lt;/h3&gt;

&lt;p&gt;The choice is deliberately clear-cut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Java (Quarkus)&lt;/strong&gt; for the application layer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; for packaging&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes&lt;/strong&gt; as the primary runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knative&lt;/strong&gt; to introduce serverless&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A clear stance is even taken during the talk:&lt;/p&gt;

&lt;p&gt;Agent workflows will become industrialized, and Kubernetes will remain their operating system.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔥 From local demo to production
&lt;/h3&gt;

&lt;p&gt;The demonstration follows a very concrete, almost pedagogical path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creation of a &lt;strong&gt;local chatbot&lt;/strong&gt; connected to a model via Docker Model Runner&lt;/li&gt;
&lt;li&gt;Exposure via a simple HTTP API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Containerization&lt;/strong&gt; of the application&lt;/li&gt;
&lt;li&gt;Deployment on Kubernetes&lt;/li&gt;
&lt;li&gt;Execution in a pod… capable of interacting with the local model&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 Interesting point:&lt;br&gt;
the model remains accessible via an OpenAI compatible API, which allows reuse of any existing library without heavy adaptation.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ Knative - the real game changer
&lt;/h3&gt;

&lt;p&gt;Once the application is deployed on Kubernetes, switching to &lt;strong&gt;Knative&lt;/strong&gt; completely changes the execution model.&lt;/p&gt;

&lt;p&gt;Instead of managing continuous pods, we're switching to a &lt;strong&gt;native Kubernetes serverless&lt;/strong&gt; model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no traffic → &lt;strong&gt;0 pods&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Incoming request → &lt;strong&gt;Automatic creation of a pod&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;peak load → &lt;strong&gt;massive auto-scaling&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;End of activity → &lt;strong&gt;return to zero&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Simple but effective demonstration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;code&gt;curl&lt;/code&gt; → triggers the creation of a pod
The request has been processed.&lt;/li&gt;
&lt;li&gt;A few seconds later → the pod disappears&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We no longer manage machines, but only &lt;strong&gt;on-demand workloads&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 The real problem: the agents' memory
&lt;/h3&gt;

&lt;p&gt;This model immediately raises a critical question:&lt;/p&gt;

&lt;p&gt;What happens to memory when everything scales to zero?&lt;/p&gt;

&lt;p&gt;The proposed solution is pragmatic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;make agents &lt;strong&gt;stateless&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;externalize the state into a dedicated system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Solution used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Redis&lt;/strong&gt; as shared memory&lt;/li&gt;
&lt;li&gt;Storing the state of conversations/agents outside of pods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agents can be recreated on the fly&lt;/li&gt;
&lt;li&gt;Memory persists independently of the infrastructure&lt;/li&gt;
&lt;li&gt;The system remains compatible with Knative's aggressive scaling&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧩 Towards distributed agentic systems
&lt;/h3&gt;

&lt;p&gt;The conclusion opens up an interesting direction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent deployment via &lt;strong&gt;Kubernetes CRDs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;communication between agents&lt;/li&gt;
&lt;li&gt;large-scale orchestration&lt;/li&gt;
&lt;li&gt;Triggering via events (Kafka, HTTP…)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 In just a few lines of YAML, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy multiple agents&lt;/li&gt;
&lt;li&gt;to make them communicate&lt;/li&gt;
&lt;li&gt;manage their lifecycle automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💡 Takeaway
&lt;/h3&gt;

&lt;p&gt;This section completely changes perspective:&lt;/p&gt;

&lt;p&gt;An agent is no longer a script or a local tool.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It is a distributed, ephemeral computing unit, orchestrated by Kubernetes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And with Knative + Redis, we obtain an architecture where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the execution is &lt;strong&gt;flexible&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;the state is &lt;strong&gt;outsourced&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;and agents become truly &lt;strong&gt;scalable in production&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧭 Global vision
&lt;/h2&gt;

&lt;p&gt;The talks are converging in the same direction:&lt;/p&gt;

&lt;h3&gt;
  
  
  🔁 Before
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;LLM = assistant&lt;/li&gt;
&lt;li&gt;occasional use&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🚀 Now
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;autonomous agents&lt;/li&gt;
&lt;li&gt;multi-agent&lt;/li&gt;
&lt;li&gt;orchestration&lt;/li&gt;
&lt;li&gt;actual execution&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧩 The key building blocks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;th&gt;Solution&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agents&lt;/td&gt;
&lt;td&gt;Docker Agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Docker Sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Models&lt;/td&gt;
&lt;td&gt;Docker Model Runner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orchestration&lt;/td&gt;
&lt;td&gt;YAML / multi-agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infra&lt;/td&gt;
&lt;td&gt;Kubernetes / Knative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;Repeat&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

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

&lt;p&gt;The real issue is not limiting the number of agents, but:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;give them maximum autonomy within a strictly controlled framework&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Key concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sandboxing&lt;/li&gt;
&lt;li&gt;network policies&lt;/li&gt;
&lt;li&gt;secure injection of secrets&lt;/li&gt;
&lt;li&gt;multi-agent orchestration&lt;/li&gt;
&lt;li&gt;infra scalable&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🚀 Takeaway
&lt;/h2&gt;

&lt;p&gt;We move from:&lt;/p&gt;

&lt;p&gt;👉 “I ask an AI”&lt;br&gt;
has&lt;br&gt;
👉 “I delegate to an autonomous system”&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4620.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4620.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4621.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4621.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4635.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4635.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4636.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4636.jpg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4637.jpg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/2026-04-21_ai_tinkerers_paris_agentic_workflows_docker/IMG_4637.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>👨‍💻 Benchmarking Small Language Models in the Real World</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Tue, 21 Apr 2026 07:55:27 +0000</pubDate>
      <link>https://dev.to/matyo91/benchmarking-small-language-models-in-the-real-world-2l45</link>
      <guid>https://dev.to/matyo91/benchmarking-small-language-models-in-the-real-world-2l45</guid>
      <description>&lt;p&gt;On Saturday, April 18th, I participated in a hackathon that invites machine learning engineers, data engineers and researchers to Paris for an in-depth study of the evaluation of small language models (SLM).&lt;/p&gt;

&lt;p&gt;This hackathon, organized by &lt;a href="https://paris.aitinkerers.org/p/hackathon-benchmarking-small-language-models-in-the-real-world" rel="noopener noreferrer"&gt;AI Tinkerers Paris&lt;/a&gt;, addresses a very concrete problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;test the actual ability of language models to produce &lt;strong&gt;production-ready&lt;/strong&gt; executable code.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The theme - &lt;em&gt;"Benchmarking Small Language Models in the Real World"&lt;/em&gt; - sets a clear framework: moving beyond impressive demos to confront models with real-world constraints (execution, performance, resources). &lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Objective
&lt;/h2&gt;

&lt;p&gt;The challenge is to automatically generate &lt;strong&gt;Polars&lt;/strong&gt; queries from natural language, with a strong requirement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;produce &lt;strong&gt;correct&lt;/strong&gt; code&lt;/li&gt;
&lt;li&gt;ensure that it is &lt;strong&gt;executable&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Optimize &lt;strong&gt;execution time&lt;/strong&gt; and &lt;strong&gt;memory consumption&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The scoring reflects this reality:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Score = N / (T × VRAM^0.1 × RAM^0.01)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;👉 In other words: accuracy alone is not enough - &lt;strong&gt;system efficiency becomes a central constraint&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Technical Context
&lt;/h2&gt;

&lt;p&gt;Each team works in a standardized environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;execution under Docker&lt;/li&gt;
&lt;li&gt;Use of &lt;strong&gt;Polars&lt;/strong&gt; for data processing&lt;/li&gt;
&lt;li&gt;GPU/memory constraints&lt;/li&gt;
&lt;li&gt;evaluation dataset provided&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to create "the best prompt", but to build a system capable of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;withstand real data&lt;/li&gt;
&lt;li&gt;produce robust code&lt;/li&gt;
&lt;li&gt;run an automated benchmark&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧩 Positioning
&lt;/h2&gt;

&lt;p&gt;This hackathon stands out because of its approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no marketing demo&lt;/li&gt;
&lt;li&gt;no "impressive but fragile" generation&lt;/li&gt;
&lt;li&gt;focus on &lt;strong&gt;what really works&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This is an environment that directly exposes the current limitations of LLM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hallucinations&lt;/li&gt;
&lt;li&gt;syntax errors&lt;/li&gt;
&lt;li&gt;Misunderstanding of the data schema&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it forces you to build around it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prompt structured engineering&lt;/li&gt;
&lt;li&gt;systematic validation&lt;/li&gt;
&lt;li&gt;fast iteration loop&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📊 Reading
&lt;/h2&gt;

&lt;p&gt;This is not a "creative" hackathon, but an &lt;strong&gt;engineering benchmark&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The final deliverable is not an idea, but:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a measurable, reproducible, and comparable system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🏗️ Day's Organization
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Morning - framing and initialization
&lt;/h3&gt;

&lt;p&gt;The morning is dedicated to setting up the technical and organizational framework:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Team formation via the event portal &lt;/li&gt;
&lt;li&gt;Presentation of the problem by the organizers and mentors &lt;/li&gt;
&lt;li&gt;Clarification of expectations (generation of executable Polars code + scoring)&lt;/li&gt;
&lt;li&gt;Initial setup of the work environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;Darkwood&lt;/strong&gt; team is formed around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/matyo91" rel="noopener noreferrer"&gt;Mathieu Ledru&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/vej333" rel="noopener noreferrer"&gt;Victor-eliejah Garnier&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/mirza-andriamanamisoa-marotsaha-891926b1/" rel="noopener noreferrer"&gt;Mirza Marotsaha&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The objective of this phase is to &lt;strong&gt;reduce uncertainty&lt;/strong&gt; and align everyone on an executable pipeline from the very first hours.&lt;/p&gt;

&lt;h3&gt;
  
  
  Midday - Forced Break
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lunch provided on site&lt;/li&gt;
&lt;li&gt;informal exchanges between teams&lt;/li&gt;
&lt;li&gt;Consultation of the message center (general questions, clarifications from the jury)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Short phase, without real decoupling: the project remains in iteration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Afternoon - Implementation and Iterations
&lt;/h3&gt;

&lt;p&gt;The afternoon is entirely production-oriented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;implementation of the benchmark (&lt;code&gt;polars-bench&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;integration of the model via &lt;code&gt;ai-harness&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;experimentation on prompts (structure, format, constraints)&lt;/li&gt;
&lt;li&gt;Adjusting model behavior via dataset and prompt engineering&lt;/li&gt;
&lt;li&gt;progressive validation via actual execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The iterations focus on three areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hallucination reduction&lt;/strong&gt; (schema-aware prompting)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;improved executable code rate&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;score optimization (time / memory / accuracy)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 The logic is not to add features, but to &lt;strong&gt;tighten the system around real constraints&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ Benchmark Architecture
&lt;/h2&gt;

&lt;p&gt;The system relies on a clear separation of responsibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ai-harness&lt;/code&gt; → pattern orchestration layer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;polars-bench&lt;/code&gt; → execution and evaluation engine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This breakdown allows us to isolate the generation (LLM) from the execution reality (runtime), which is precisely the objective of the benchmark.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 Sponsors, Mentors &amp;amp; Organizers, Teams
&lt;/h2&gt;

&lt;p&gt;This hackathon is made possible thanks to an ecosystem of complementary players: sponsors, mentors and organizers, each playing a key role in the overall experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  🏢 Organizers
&lt;/h3&gt;

&lt;p&gt;The event is organized by the AI ​​Tinkerers Paris community, a collective active in experimenting with and sharing AI technologies.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌐 Official website: &lt;a href="https://paris.aitinkerers.org" rel="noopener noreferrer"&gt;https://paris.aitinkerers.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📅 Hackathon page: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk" rel="noopener noreferrer"&gt;https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;👥 Organizers: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/organizers" rel="noopener noreferrer"&gt;https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/organizers&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Their positioning is clear: to promote concrete experimentation around AI models, with a focus on real engineering rather than demonstration.&lt;/p&gt;

&lt;h3&gt;
  
  
  💼 Sponsors
&lt;/h3&gt;

&lt;p&gt;Sponsors support the event by providing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;technical resources (GPU, infrastructure, tools)&lt;/li&gt;
&lt;li&gt;funding&lt;/li&gt;
&lt;li&gt;visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Their role is critical to enabling a realistic environment (compute constraints, Docker execution, etc.).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mistral&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sponsor page: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/sponsors" rel="noopener noreferrer"&gt;Hackathon Sponsors&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Representative: &lt;a href="https://www.linkedin.com/in/matthieu-dinot-022378222/" rel="noopener noreferrer"&gt;Matthieu Dinot&lt;/a&gt; — AI Scientist at Mistral&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Alpic&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sponsor page: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/sponsors" rel="noopener noreferrer"&gt;Hackathon Sponsors&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Representative: &lt;a href="https://www.linkedin.com/in/nikolayrodionov/" rel="noopener noreferrer"&gt;Nikolay Rodionov&lt;/a&gt; — COO at Alpic&lt;/li&gt;
&lt;li&gt;Other links:&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/jeanroudy" rel="noopener noreferrer"&gt;X / Twitter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/rodincave" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Cloudfare&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sponsor page: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/sponsors" rel="noopener noreferrer"&gt;Hackathon Sponsors&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Representative: &lt;a href="https://www.linkedin.com/in/cyril-bouissou" rel="noopener noreferrer"&gt;Nans Cyril Bouissou&lt;/a&gt; — Account executive at Cloudfare&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Fold&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sponsor page: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/sponsors" rel="noopener noreferrer"&gt;Hackathon Sponsors&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Representative: &lt;a href="https://linkedin.com/in/raoufchebri" rel="noopener noreferrer"&gt;Raouf Chebri&lt;/a&gt; — Developer Relations Engineer at Replit&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Microsoft&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sponsor page: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/sponsors" rel="noopener noreferrer"&gt;Hackathon Sponsors&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Representative: &lt;a href="https://www.linkedin.com/in/jubichon/" rel="noopener noreferrer"&gt;Julien Bichon&lt;/a&gt; — Developer Experience | GTM Manager at Microsoft&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;ESGI&lt;/strong&gt; &lt;em&gt;(venue partner mentioned alongside sponsors)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sponsor / venue page: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/sponsors" rel="noopener noreferrer"&gt;Hackathon Sponsors&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Representative: Astrid Beaucourt — Communications Officer at ESGI&lt;/li&gt;
&lt;li&gt;School links:&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/school/esgi/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/esgi" rel="noopener noreferrer"&gt;X/Twitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧑‍🏫 Mentors
&lt;/h3&gt;

&lt;p&gt;Mentors support participants throughout the hackathon:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;assistance in structuring approaches&lt;/li&gt;
&lt;li&gt;Feedback on templates and prompts&lt;/li&gt;
&lt;li&gt;tips on performance and optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 They help avoid common dead ends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;over-optimization of the prompt&lt;/li&gt;
&lt;li&gt;lack of validation&lt;/li&gt;
&lt;li&gt;&lt;p&gt;errors in data interpretation&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Arthur Mensch&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mentor page: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/mentors" rel="noopener noreferrer"&gt;Hackathon Mentors&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Role: Co-founder and CEO of Mistral AI&lt;/li&gt;
&lt;li&gt;Public profile link: not visible in the provided data&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Leo Arsenin&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mentor page: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/mentors" rel="noopener noreferrer"&gt;Hackathon Mentors&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://www.linkedin.com/in/leoarsenin" rel="noopener noreferrer"&gt;Léo Arsenin&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Role: Solutions engineer at Cloudfare&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Matthieu Dinot&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mentor page: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/mentors" rel="noopener noreferrer"&gt;Hackathon Mentors&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://www.linkedin.com/in/matthieu-dinot-022378222/" rel="noopener noreferrer"&gt;Matthieu Dinot&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Role: AI Scientist at Mistral&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Preetham Kaukuntla&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mentor page: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/mentors" rel="noopener noreferrer"&gt;Hackathon Mentors&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;LinkedIn: &lt;a href="https://www.linkedin.com/in/preetham-kaukuntla-a43841105" rel="noopener noreferrer"&gt;Preetham Kaukuntla&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Role: Staff Data Scientist at Glassdoor&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Mentors Message Board&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/chat?channel=hackathon_team_ht_gW9Xg0G3S44#hackathon_team_ht_gW9Xg0G3S44" rel="noopener noreferrer"&gt;Mentors Message Board&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  👥 Teams
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_qFVxlREukLQ"&gt;Darkwood&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status: &lt;strong&gt;1st Place&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Entry: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_qFVxlREukLQ"&gt;/hackathons/h_sj1ca_J4Hdk/entries/ht_qFVxlREukLQ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Team: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_qFVxlREukLQ"&gt;/hackathons/h_sj1ca_J4Hdk/teams/ht_qFVxlREukLQ&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo video: &lt;a href="https://youtu.be/sUq5Z_jNtKc?is=3Omo4O1sErux6_ds" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Members:&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_qFVxlREukLQ"&gt;Mathieu Ledru&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_qFVxlREukLQ"&gt;Mirza Marotsaha&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_qFVxlREukLQ"&gt;Victor-eliejah GARNIER&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_-p8xvdGl-oA"&gt;bluebull&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status: &lt;strong&gt;Best Startup&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Entry: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_-p8xvdGl-oA"&gt;/hackathons/h_sj1ca_J4Hdk/entries/ht_-p8xvdGl-oA&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Team: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_-p8xvdGl-oA"&gt;/hackathons/h_sj1ca_J4Hdk/teams/ht_-p8xvdGl-oA&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Members:&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_-p8xvdGl-oA"&gt;Vasiliki Doropoulou&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_ub4tDzlrft0"&gt;Muon&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status: &lt;strong&gt;10x Data Scientist&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Entry: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_ub4tDzlrft0"&gt;/hackathons/h_sj1ca_J4Hdk/entries/ht_ub4tDzlrft0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Team: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_ub4tDzlrft0"&gt;/hackathons/h_sj1ca_J4Hdk/teams/ht_ub4tDzlrft0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Members:&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_ub4tDzlrft0"&gt;Imane Momayiz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_y4_Yz6P5BZE"&gt;Polaris&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status: &lt;strong&gt;Finalist&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Entry: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_y4_Yz6P5BZE"&gt;/hackathons/h_sj1ca_J4Hdk/entries/ht_y4_Yz6P5BZE&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Team: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_y4_Yz6P5BZE"&gt;/hackathons/h_sj1ca_J4Hdk/teams/ht_y4_Yz6P5BZE&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Members:&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_y4_Yz6P5BZE"&gt;Hippolyte Dupont&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_y4_Yz6P5BZE"&gt;Ghaith ABDESSALEM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_y4_Yz6P5BZE"&gt;Jacques Dumora&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_njEtwEBAmUE"&gt;Training Expert&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status: &lt;strong&gt;Finalist&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Entry: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_njEtwEBAmUE"&gt;/hackathons/h_sj1ca_J4Hdk/entries/ht_njEtwEBAmUE&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Team: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_njEtwEBAmUE"&gt;/hackathons/h_sj1ca_J4Hdk/teams/ht_njEtwEBAmUE&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Members:&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_njEtwEBAmUE"&gt;Eva Useros Marugan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_njEtwEBAmUE"&gt;Paul-Louis Fouesnant&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_wRj-nEG24zE"&gt;CodeMind&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status: &lt;strong&gt;Submitted&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Entry: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_wRj-nEG24zE"&gt;/hackathons/h_sj1ca_J4Hdk/entries/ht_wRj-nEG24zE&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Team: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_wRj-nEG24zE"&gt;/hackathons/h_sj1ca_J4Hdk/teams/ht_wRj-nEG24zE&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Members:&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_wRj-nEG24zE"&gt;Amelie Smith&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_wRj-nEG24zE"&gt;Damien Frechou&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_wRj-nEG24zE"&gt;Anis Kaci&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_wRj-nEG24zE"&gt;Choutri Adel Djalil&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_RFBTGYYwbm4"&gt;Coffe is life&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status: &lt;strong&gt;Submitted&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Entry: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_RFBTGYYwbm4"&gt;/hackathons/h_sj1ca_J4Hdk/entries/ht_RFBTGYYwbm4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Team: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_RFBTGYYwbm4"&gt;/hackathons/h_sj1ca_J4Hdk/teams/ht_RFBTGYYwbm4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Members:&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_RFBTGYYwbm4"&gt;Pierre Lepagnol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_RFBTGYYwbm4"&gt;Filipp Trigub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_Gc4SneBV2D4"&gt;PiLLM&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status: &lt;strong&gt;Submitted&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Entry: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/entries/ht_Gc4SneBV2D4"&gt;/hackathons/h_sj1ca_J4Hdk/entries/ht_Gc4SneBV2D4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Team: &lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_Gc4SneBV2D4"&gt;/hackathons/h_sj1ca_J4Hdk/teams/ht_Gc4SneBV2D4&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Members:&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_Gc4SneBV2D4"&gt;Din Sokheng&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/hackathons/h_sj1ca_J4Hdk/teams/ht_Gc4SneBV2D4"&gt;Ahmed Abdelaziz Mokeddem&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔗 Useful Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🏠 Home: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk" rel="noopener noreferrer"&gt;https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;👥 Teams: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/teams" rel="noopener noreferrer"&gt;https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/teams&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📩 Message Center: &lt;a href="https://paris.aitinkerers.org/message_center?board_key=meetup_mu_eZJ5tCXlA2A" rel="noopener noreferrer"&gt;https://paris.aitinkerers.org/message_center?board_key=meetup_mu_eZJ5tCXlA2A&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🏆 Submissions: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/entries" rel="noopener noreferrer"&gt;https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/entries&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📊 Results: &lt;a href="https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/results" rel="noopener noreferrer"&gt;https://paris.aitinkerers.org/hackathons/h_sj1ca_J4Hdk/results&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧱 Technical Stack
&lt;/h2&gt;

&lt;p&gt;The architecture is intentionally simple, but constrained by real-world conditions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; for execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polars&lt;/strong&gt; as a search engine&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quinn 2.5&lt;/strong&gt; as a generation model&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt; for the interface&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local sandbox (CPU)&lt;/strong&gt; with memory constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core of the system is an API that transforms a natural request into &lt;strong&gt;directly executable Polars code&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔄 Execution Pipeline
&lt;/h2&gt;

&lt;p&gt;The benchmark requires a complete chain, without shortcuts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Query (NL)
    ↓
Prompt enrichi (schema + règles)
    ↓
LLM
    ↓
Code Polars généré
    ↓
Exécution réelle
    ↓
Validation
    ↓
Scoring
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 The model is not evaluated on what it "says", but on what its code &lt;strong&gt;actually produces&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Generation Strategy
&lt;/h2&gt;

&lt;p&gt;The key choice is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ train the model&lt;br&gt;
✅ to constrain one's behavior&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rather than heavy-handed fine-tuning, the system is based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;structured prompt&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;a &lt;strong&gt;dataset of targeted examples&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Required Format
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;System:
- règles Polars
- contraintes strictes

User:
- schéma
- requête

Assistant:
- code uniquement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 The model learns an &lt;strong&gt;execution pattern&lt;/strong&gt;, not general knowledge.&lt;/p&gt;

&lt;h2&gt;
  
  
  🗂️ Dataset
&lt;/h2&gt;

&lt;p&gt;The dataset is not massive, it is &lt;strong&gt;intentional&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;15 to 500 examples&lt;/li&gt;
&lt;li&gt;focused on critical patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cutlery:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;selection&lt;/li&gt;
&lt;li&gt;filters&lt;/li&gt;
&lt;li&gt;aggregations&lt;/li&gt;
&lt;li&gt;joins&lt;/li&gt;
&lt;li&gt;window functions&lt;/li&gt;
&lt;li&gt;nulls&lt;/li&gt;
&lt;li&gt;edge cases&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Coverage is more important than volume.&lt;/p&gt;

&lt;h2&gt;
  
  
  📊 Schema injection
&lt;/h2&gt;

&lt;p&gt;The model doesn't guess anything.&lt;br&gt;
The scheme is injected systematically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"columns"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"card_name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mana_cost"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"frequency"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Direct effects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fewer hallucinations&lt;/li&gt;
&lt;li&gt;Valid queries on the first try&lt;/li&gt;
&lt;li&gt;strong dependence on the provided context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Without a diagram, the system collapses.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ Inference Constraints
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;~6GB model&lt;/li&gt;
&lt;li&gt;CPU only&lt;/li&gt;
&lt;li&gt;high latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consequence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every call counts&lt;/li&gt;
&lt;li&gt;Re-sorting is expensive&lt;/li&gt;
&lt;li&gt;The prompt must be precise from the outset&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 The cost of error is included in the score.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧪 Validation &amp;amp; scoring
&lt;/h2&gt;

&lt;p&gt;The benchmark validates a &lt;strong&gt;complete behavior&lt;/strong&gt;, not a raw output.&lt;/p&gt;

&lt;h3&gt;
  
  
  Levels
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Valid code&lt;/li&gt;
&lt;li&gt;Successful execution&lt;/li&gt;
&lt;li&gt;Correct result&lt;/li&gt;
&lt;li&gt;Acceptable performance&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Score
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Score = N / (T * VRAM^0.1 * RAM^0.01)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 We measure a constrained system, not an abstract model.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔁 Architectural choices
&lt;/h2&gt;

&lt;p&gt;Three options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fine-tuning → too heavy&lt;/li&gt;
&lt;li&gt;multi-models → too complex&lt;/li&gt;
&lt;li&gt;prompt + dataset → chosen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Decision: &lt;strong&gt;encode the behavior in the data&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧩 Implementation
&lt;/h2&gt;

&lt;p&gt;The API exposes a simple stream:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;input:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;request&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Polars code&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;builds the prompt&lt;/li&gt;
&lt;li&gt;calls the model&lt;/li&gt;
&lt;li&gt;returns the code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Voluntary simplicity: the real difficulty lies elsewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Positioning
&lt;/h2&gt;

&lt;p&gt;The project is not presented as an LLM wrapper, but as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;a secure analytical copilot for tabular data&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;guided prompts&lt;/li&gt;
&lt;li&gt;structured context&lt;/li&gt;
&lt;li&gt;execution verified&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 The product is defined by its constraints, not by the model.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧭 System reading
&lt;/h2&gt;

&lt;p&gt;This benchmark shows one thing:&lt;/p&gt;

&lt;p&gt;The performance of a small model is a property of the system, not of the model alone.&lt;/p&gt;

&lt;p&gt;The real levers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structure of the prompt&lt;/li&gt;
&lt;li&gt;dataset&lt;/li&gt;
&lt;li&gt;Context injection&lt;/li&gt;
&lt;li&gt;runtime validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 We're going from an ML problem to an engineering problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧱 Components
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Harness
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;abstraction of models&lt;/li&gt;
&lt;li&gt;standardization of inputs/outputs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Executor
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;isolated execution&lt;/li&gt;
&lt;li&gt;error capture&lt;/li&gt;
&lt;li&gt;runtime metrics&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Scoring
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;validity&lt;/li&gt;
&lt;li&gt;performance&lt;/li&gt;
&lt;li&gt;stability&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📊 What is measured
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Execution&lt;/strong&gt; → Is it running?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Correction&lt;/strong&gt; → Is this correct?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polars Quality&lt;/strong&gt; → correct use of the motor&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt; → actual cost&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔍 Real-life case
&lt;/h2&gt;

&lt;p&gt;Input:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find the top 10 most frequent cards with mana cost ≤ 3"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Expected :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;filter correct&lt;/li&gt;
&lt;li&gt;correct aggregation&lt;/li&gt;
&lt;li&gt;sorting + limit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Observed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;valid but incorrect code&lt;/li&gt;
&lt;li&gt;Python fallback&lt;/li&gt;
&lt;li&gt;silent errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 The benchmark reveals the gap between &lt;strong&gt;generation&lt;/strong&gt; and &lt;strong&gt;execution&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ Real stakes
&lt;/h2&gt;

&lt;p&gt;An LLM generates plausible code, not reliable code&lt;/p&gt;

&lt;p&gt;So, in production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sandbox required&lt;/li&gt;
&lt;li&gt;systematic validation&lt;/li&gt;
&lt;li&gt;controlled retrievals&lt;/li&gt;
&lt;li&gt;monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Without this, the system is unstable by default.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Project Contribution
&lt;/h2&gt;

&lt;p&gt;This benchmark introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an end-to-end executable pipeline&lt;/li&gt;
&lt;li&gt;a multi-criteria assessment&lt;/li&gt;
&lt;li&gt;a reproducible approach&lt;/li&gt;
&lt;li&gt;a production-friendly environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rest :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/mrzdevcore/ai-harness" rel="noopener noreferrer"&gt;&lt;code&gt;ai-harness&lt;/code&gt;&lt;/a&gt; → orchestration&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/mrzdevcore/polars-bench" rel="noopener noreferrer"&gt;&lt;code&gt;polars-bench&lt;/code&gt;&lt;/a&gt; → evaluation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This is no longer a model test, it's a &lt;strong&gt;complete system test&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  📹 Demo
&lt;/h2&gt;

&lt;p&gt;Submission video:&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Hackathon Deliverables
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Full benchmark code&lt;/li&gt;
&lt;li&gt;Test set&lt;/li&gt;
&lt;li&gt;Reproducible pipeline&lt;/li&gt;
&lt;li&gt;Comparative results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example of a provided structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Nisseya/submission_example" rel="noopener noreferrer"&gt;submission_example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;main benchmark code&lt;/li&gt;
&lt;li&gt;datasets&lt;/li&gt;
&lt;li&gt;logs&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This hackathon is not intended to demonstrate that LLMs work.&lt;/p&gt;

&lt;p&gt;It shows &lt;strong&gt;where they break&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And most importantly:&lt;/p&gt;

&lt;p&gt;A useful benchmark does not measure generation.&lt;br&gt;
It measures performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔮 Darkwood Perspective
&lt;/h2&gt;

&lt;p&gt;This type of benchmark fits directly into a broader vision:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;orchestration of AI pipelines&lt;/li&gt;
&lt;li&gt;systematic validation&lt;/li&gt;
&lt;li&gt;generation/execution separation&lt;/li&gt;
&lt;li&gt;observability&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This is not a demo tool.&lt;br&gt;
It's a building block for constructing reliable systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/hackathon_ia_thinker_2026-04-18/resized_IMG_4563.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/hackathon_ia_thinker_2026-04-18/resized_IMG_4563.jpeg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/hackathon_ia_thinker_2026-04-18/resized_IMG_4564.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/hackathon_ia_thinker_2026-04-18/resized_IMG_4564.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 Sundays Lab #3 - When AI becomes a collective playground</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Mon, 20 Apr 2026 12:15:35 +0000</pubDate>
      <link>https://dev.to/matyo91/sundays-lab-3-when-ai-becomes-a-collective-playground-bpl</link>
      <guid>https://dev.to/matyo91/sundays-lab-3-when-ai-becomes-a-collective-playground-bpl</guid>
      <description>&lt;p&gt;On &lt;strong&gt;Sunday, April 19, 2026&lt;/strong&gt;, at Hexa (eFounders) in Paris, a new edition of &lt;a href="https://luma.com/62yzcu08?tk=zddnOx" rel="noopener noreferrer"&gt;&lt;strong&gt;Sundays Lab&lt;/strong&gt;&lt;/a&gt; was held.&lt;br&gt;
A seemingly simple format: coworking, AI workshop, exchange session.&lt;/p&gt;

&lt;p&gt;But in practice:&lt;br&gt;
👉 a concrete demonstration of what &lt;strong&gt;the builder ecosystem will become in 2026&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ A paradigm shift: from conference to interactive system
&lt;/h2&gt;

&lt;p&gt;The first strong signal of the event is not technical.&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;the format&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We are no longer sure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;top-down talks&lt;/li&gt;
&lt;li&gt;“Inspiring” speakers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;real-time construction&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;an ongoing interaction**&lt;/li&gt;
&lt;li&gt;a system where &lt;strong&gt;the audience becomes a co-creator&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“We didn’t want a traditional workshop. We wanted everyone to participate.” &lt;/p&gt;

&lt;p&gt;Here's a section ready to integrate into your Darkwood article 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍🚀 Speakers &amp;amp; Participants - Projects and Weak Signals
&lt;/h2&gt;

&lt;h3&gt;
  
  
  👤 Pato - AI &amp;amp; Automated Go-To-Market
&lt;/h3&gt;

&lt;p&gt;As the founder of &lt;strong&gt;Cluently&lt;/strong&gt;, he embodies the “builder + sales” profile.&lt;br&gt;
His presentation shows how AI can &lt;strong&gt;replace entire business functions&lt;/strong&gt; (prospecting, matching, CRM).&lt;/p&gt;

&lt;p&gt;👉 Project presented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI agent for automated prospecting&lt;/li&gt;
&lt;li&gt;Intelligent matching between profiles / opportunities&lt;/li&gt;
&lt;li&gt;Build Society community app generated live&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Key signal:&lt;/p&gt;

&lt;p&gt;The future of SaaS = &lt;strong&gt;agent + distribution&lt;/strong&gt;, not just product&lt;/p&gt;

&lt;h3&gt;
  
  
  👤 Jules - Growth &amp;amp; Creative AI
&lt;/h3&gt;

&lt;p&gt;Founder of &lt;strong&gt;Loops&lt;/strong&gt;, focused on performance marketing.&lt;/p&gt;

&lt;p&gt;👉 Project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SaaS for generating high-performing ads&lt;/li&gt;
&lt;li&gt;Focus on &lt;strong&gt;creativity as the main driver of growth&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Insight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Growth no longer comes from targeting&lt;/li&gt;
&lt;li&gt;but &lt;strong&gt;large-scale content creation via AI&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  👤 Tom - Personal branding &amp;amp; distribution
&lt;/h3&gt;

&lt;p&gt;Content creator (philosophy + tech), rapid growth on Instagram.&lt;/p&gt;

&lt;p&gt;👉 Positioning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build an audience before a product&lt;/li&gt;
&lt;li&gt;Transforming complex ideas into viral content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Insight:&lt;/p&gt;

&lt;p&gt;Distribution is becoming a stronger asset than tech.&lt;/p&gt;

&lt;h3&gt;
  
  
  👤 Lucas Lefner - Startup advisory &amp;amp; network
&lt;/h3&gt;

&lt;p&gt;Provides support to early-stage startups (strategy, sales, equity).&lt;/p&gt;

&lt;p&gt;👉 Model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;support in exchange for equity or mission&lt;/li&gt;
&lt;li&gt;creation of a business club (Startup Hunters)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Key insight:&lt;/p&gt;

&lt;p&gt;“90% of business is networking”&lt;/p&gt;

&lt;p&gt;👉 Signal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;return of &lt;strong&gt;network-driven business&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Importance of private circles / clubs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  👤 Enzo - Iomaris
&lt;/h3&gt;

&lt;p&gt;Real estate startup (beta phase).&lt;/p&gt;

&lt;p&gt;👉 Product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Platform for managing a real estate project from start to finish&lt;/li&gt;
&lt;li&gt;Profitability analysis, taxation, market&lt;/li&gt;
&lt;li&gt;collaboration between individuals and professionals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Business model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free for individuals&lt;/li&gt;
&lt;li&gt;Monetization via professionals (leads)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Insight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;extreme simplification of a complex domain via AI&lt;/li&gt;
&lt;li&gt;trend “vertically integrated business assistant”&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  👤 Eli - Gamified Education App
&lt;/h3&gt;

&lt;p&gt;Student (HEC), project focused on academic productivity.&lt;/p&gt;

&lt;p&gt;👉 Product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;collaborative work app&lt;/li&gt;
&lt;li&gt;Strava-type logic applied to the study&lt;/li&gt;
&lt;li&gt;comparison between students / classes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Insight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gamification + social = strong engagement lever&lt;/li&gt;
&lt;li&gt;“public progress tracking” logic&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  👤 Romain - Automated Pentest with AI
&lt;/h3&gt;

&lt;p&gt;Profile not an expert in cybersecurity.&lt;/p&gt;

&lt;p&gt;👉 Product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated penetration testing service via AI&lt;/li&gt;
&lt;li&gt;Use of scripts + LLM to detect vulnerabilities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one-off service (audit)&lt;/li&gt;
&lt;li&gt;no ongoing maintenance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Key insight:&lt;/p&gt;

&lt;p&gt;AI makes it possible to create expert services without initial expertise.&lt;/p&gt;

&lt;p&gt;👉 Signal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explosion of &lt;strong&gt;AI-augmented agencies&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  👤 Laurent (Startup Hunters) - Ecosystem &amp;amp; Support
&lt;/h3&gt;

&lt;p&gt;Supports startups and young entrepreneurs.&lt;/p&gt;

&lt;p&gt;👉 Activity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;business structuring&lt;/li&gt;
&lt;li&gt;Connecting investors and founders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Insight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lack of operational support for early founders&lt;/li&gt;
&lt;li&gt;growing need for &lt;strong&gt;on-the-ground guidance&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  👤 GEO Project (AI Search Optimization)
&lt;/h3&gt;

&lt;p&gt;E-commerce consultant / Advanced SEO.&lt;/p&gt;

&lt;p&gt;👉 Product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;optimization tool to appear in LLM responses&lt;/li&gt;
&lt;li&gt;alternative to traditional SEO&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Function:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;analysis of the sources used by AI&lt;/li&gt;
&lt;li&gt;Content optimization + ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Key insight:&lt;/p&gt;

&lt;p&gt;AI traffic will surpass traditional SEO&lt;/p&gt;

&lt;h3&gt;
  
  
  👤 Social Matching Project (anonymous)
&lt;/h3&gt;

&lt;p&gt;Next generation social network concept.&lt;/p&gt;

&lt;p&gt;👉 Product:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weekly matching based on deep interests&lt;/li&gt;
&lt;li&gt;No profile, no swipe&lt;/li&gt;
&lt;li&gt;authentic interaction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Insight:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reaction to the saturation of social networks&lt;/li&gt;
&lt;li&gt;back to &lt;strong&gt;qualitative interactions&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧭 Overall reading
&lt;/h2&gt;

&lt;p&gt;These profiles show a clear convergence:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. All projects use AI
&lt;/h3&gt;

&lt;p&gt;But at different levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automation (sales, penetration testing)&lt;/li&gt;
&lt;li&gt;product (ads, real estate)&lt;/li&gt;
&lt;li&gt;distribution (content, GEO)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. The technical barrier disappears
&lt;/h3&gt;

&lt;p&gt;➡️ Everyone can build&lt;br&gt;
➡️ so the difference lies elsewhere&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The real weapons become:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;network&lt;/li&gt;
&lt;li&gt;distribution&lt;/li&gt;
&lt;li&gt;branding&lt;/li&gt;
&lt;li&gt;niche&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In concrete terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an app generated live&lt;/li&gt;
&lt;li&gt;decisions made via vote&lt;/li&gt;
&lt;li&gt;a product built in front of the audience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 The event itself becomes a &lt;strong&gt;product prototype&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤖 AI is no longer a tool, it's a production interface
&lt;/h2&gt;

&lt;p&gt;The workshop highlighted a key point:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Software creation is now iterative, public, and assisted.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A concrete example observed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;app scenario generation&lt;/li&gt;
&lt;li&gt;code generation with LLM (Claude)&lt;/li&gt;
&lt;li&gt;Automatic error correction&lt;/li&gt;
&lt;li&gt;near-immediate deployment (Cloudflare)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Claude generates the code, corrects his errors, and we build the app as we go.” &lt;/p&gt;

&lt;h3&gt;
  
  
  What it actually changes
&lt;/h3&gt;

&lt;p&gt;Before :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;design → dev → test → deploy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NOW :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;intention → generation → feedback → correction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 The cycle becomes &lt;strong&gt;continuous and conversational&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 The real issue: distribution &amp;gt; technology
&lt;/h2&gt;

&lt;p&gt;One point came up several times during the exchange session:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Technology is no longer the barrier to entry.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What remains difficult:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;find customers&lt;/li&gt;
&lt;li&gt;distribute a product&lt;/li&gt;
&lt;li&gt;create an audience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Code is becoming commoditized. The real barrier is distribution.” &lt;/p&gt;

&lt;h3&gt;
  
  
  Direct consequence
&lt;/h3&gt;

&lt;p&gt;We observe a shift:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;Now&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Build a product&lt;/td&gt;
&lt;td&gt;Build an audience&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optimize tech&lt;/td&gt;
&lt;td&gt;Optimize acquisition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Be a developer&lt;/td&gt;
&lt;td&gt;Be a full operator&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  📈 Acquisition: Organized Chaos
&lt;/h2&gt;

&lt;p&gt;The discussions highlighted a reality:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;There is no longer a single dominant channel.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Canals mentioned
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;LinkedIn (B2B, decision-makers)&lt;/li&gt;
&lt;li&gt;Instagram (creation + virality)&lt;/li&gt;
&lt;li&gt;Twitter/X (monitoring + opportunities)&lt;/li&gt;
&lt;li&gt;Email (still extremely effective)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Insight
&lt;/h3&gt;

&lt;p&gt;👉 Efficiency comes from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repetition&lt;/li&gt;
&lt;li&gt;multi-channel presence&lt;/li&gt;
&lt;li&gt;the transformation of content into multiple formats&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“A video → shorts → reels → LinkedIn post → newsletter” &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🧩 The emergence of “hybrid builders”
&lt;/h2&gt;

&lt;p&gt;One profile keeps recurring:&lt;/p&gt;

&lt;p&gt;👉 people &lt;strong&gt;not technically expert&lt;/strong&gt;&lt;br&gt;
→ capable of creating products using AI&lt;/p&gt;

&lt;p&gt;A striking example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creation of an automated penetration testing service&lt;/li&gt;
&lt;li&gt;without advanced cybersecurity expertise&lt;/li&gt;
&lt;li&gt;based on tool orchestration + LLM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“I don’t have strong technical skills, but it works.” &lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 The underlying problem: cognitive overload
&lt;/h2&gt;

&lt;p&gt;Everyone shares the same feeling:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;AI is going too fast&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Symptoms :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;permanent FOMO&lt;/li&gt;
&lt;li&gt;too many tools&lt;/li&gt;
&lt;li&gt;too many new things&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Observed response:&lt;/p&gt;

&lt;p&gt;👉 Return to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Task structuring (SOP)&lt;/li&gt;
&lt;li&gt;simplification&lt;/li&gt;
&lt;li&gt;focus&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“Write down your tasks one by one, then see what AI can optimize.” &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🧬 AI amplifies… but does not replace
&lt;/h2&gt;

&lt;p&gt;A central question was raised:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Will AI kill products?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Overall response from the group:&lt;/p&gt;

&lt;p&gt;❌ No&lt;br&gt;
✅ It filters&lt;/p&gt;

&lt;h3&gt;
  
  
  What disappears
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;low-quality products&lt;/li&gt;
&lt;li&gt;SaaS without distribution&lt;/li&gt;
&lt;li&gt;worthless clones&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What remains
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;branding&lt;/li&gt;
&lt;li&gt;network&lt;/li&gt;
&lt;li&gt;human relationship&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“AI amplifies both the good and the bad.” &lt;/p&gt;

&lt;h2&gt;
  
  
  🌐 Towards a new layer: GEO (AI Search)
&lt;/h2&gt;

&lt;p&gt;An advanced topic has emerged:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;GEO (Generative Engine Optimization)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Objective :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;appear in LLM responses (ChatGPT, etc.)&lt;/li&gt;
&lt;li&gt;not just in Google&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Figures mentioned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;18x growth in AI traffic&lt;/li&gt;
&lt;li&gt;4x conversion on this traffic&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“Users coming from ChatGPT convert 4x more.” &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;👉 This is probably the equivalent of SEO… AI version.&lt;/p&gt;

&lt;h2&gt;
  
  
  🤝 The heart of the model: connecting people
&lt;/h2&gt;

&lt;p&gt;The product built during the event is revealing:&lt;/p&gt;

&lt;p&gt;👉 a matching app for participants&lt;/p&gt;

&lt;p&gt;Aim :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect problems ↔ solutions&lt;/li&gt;
&lt;li&gt;create real synergies&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;“Matching problems with solutions.” &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🧭 Darkwood Reading
&lt;/h2&gt;

&lt;p&gt;This meetup confirms several major trends:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The technical stack becomes secondary
&lt;/h3&gt;

&lt;p&gt;Symfony, Node, etc. → important&lt;br&gt;
But more differentiating on its own&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Orchestration becomes key
&lt;/h3&gt;

&lt;p&gt;What you do with Flow → totally aligned&lt;/p&gt;

&lt;p&gt;👉 Connect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data&lt;/li&gt;
&lt;li&gt;agents&lt;/li&gt;
&lt;li&gt;workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. The product = system + distribution
&lt;/h3&gt;

&lt;p&gt;Not just code&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The future is hybrid
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AI → execution&lt;/li&gt;
&lt;li&gt;human → direction&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Sundays Lab #3 is not a meetup.&lt;/strong&gt;&lt;br&gt;
This is a prototype of what the tech ecosystem is becoming.&lt;/p&gt;

&lt;p&gt;👉 A space where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;on build live&lt;/li&gt;
&lt;li&gt;we learn by doing&lt;/li&gt;
&lt;li&gt;we connect in real time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And most importantly:&lt;/p&gt;

&lt;p&gt;👉 where the real skill is no longer coding&lt;br&gt;
but to &lt;strong&gt;transform an intention into a functional system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="/blog/images/articles/sundays-lab-3/resized_IMG_4568.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/sundays-lab-3/resized_IMG_4568.jpeg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/sundays-lab-3/resized_IMG_4569.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/sundays-lab-3/resized_IMG_4569.jpeg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/sundays-lab-3/resized_IMG_4590.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/sundays-lab-3/resized_IMG_4590.jpeg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/sundays-lab-3/resized_IMG_4583.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/sundays-lab-3/resized_IMG_4583.jpeg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/sundays-lab-3/resized_IMG_4582.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/sundays-lab-3/resized_IMG_4582.jpeg"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="/blog/images/articles/sundays-lab-3/resized_IMG_4584.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="/blog/images/articles/sundays-lab-3/resized_IMG_4584.jpeg"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>⚙️ Message-oriented vs. Data-oriented orchestration - from data to knowledge</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Fri, 17 Apr 2026 15:37:26 +0000</pubDate>
      <link>https://dev.to/matyo91/message-oriented-vs-data-oriented-orchestration-from-data-to-knowledge-1pmd</link>
      <guid>https://dev.to/matyo91/message-oriented-vs-data-oriented-orchestration-from-data-to-knowledge-1pmd</guid>
      <description>&lt;p&gt;For intellectual property reasons, the subject chosen for the application of this article will not be the one discussed, although it is closely related. For any further information, please contact &lt;a href="https://www.linkedin.com/in/omer-lakraa" rel="noopener noreferrer"&gt;Omer&lt;/a&gt; who will be happy to answer, and apologize for any potential inconvenience.&lt;/p&gt;

&lt;p&gt;In this article, we explore two fundamental approaches to software orchestration:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Message-Oriented Orchestration&lt;/strong&gt;: via &lt;a href="https://symfony.com/doc/current/messenger.html" rel="noopener noreferrer"&gt;Symfony Messenger&lt;/a&gt; synchronous respectively asynchronous&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data-Oriented Orchestration&lt;/strong&gt;: via &lt;a href="https://navi.darkwood.com" rel="noopener noreferrer"&gt;Navi&lt;/a&gt; for synchronous and &lt;a href="https://flow.darkwood.com" rel="noopener noreferrer"&gt;Flow&lt;/a&gt; for asynchronous&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The case study is based on a classic but structuring problem: &lt;strong&gt;text mining applied to a set of Git repositories&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
For the practical demonstration, I will take the EIT tutorial from 2007/2008 carried out at the time on classification with &lt;a href="https://www.linkedin.com/in/matthieu-beyou-9a425a32/" rel="noopener noreferrer"&gt;Matthieu Beyou&lt;/a&gt; during computer science class tutorials.&lt;br&gt;&lt;br&gt;
For the data, we use those of &lt;a href="https://www.linkedin.com/in/omer-lakraa" rel="noopener noreferrer"&gt;Omer&lt;/a&gt; (former work colleague) available on his site &lt;a href="https://git.arkalo.ovh" rel="noopener noreferrer"&gt;https://git.arkalo.ovh&lt;/a&gt; (via the api).&lt;/p&gt;

&lt;p&gt;The goal is not to produce the best machine learning model, but to understand &lt;strong&gt;how the form of orchestration influences the complexity, readability, and scalability of the system&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The problem: transforming repositories into usable knowledge&lt;/p&gt;

&lt;p&gt;The dataset consists of a list of Git repositories defined in a &lt;code&gt;repos.json&lt;/code&gt; file, the data of the directories listed on &lt;a href="https://git.arkalo.ovh/explore/repos" rel="noopener noreferrer"&gt;https://git.arkalo.ovh/explore/repos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For your information, you can extract the information using the Composio connector for &lt;a href="https://composio.dev/toolkits/gitea" rel="noopener noreferrer"&gt;https://composio.dev/toolkits/gitea&lt;/a&gt;. Refer to my previous article for the implementation: &lt;a href="https://blog.darkwood.com/fr/article/relacher-les-connecteurs-des-outils-au-langage" rel="noopener noreferrer"&gt;https://blog.darkwood.com/fr/article/relacher-les-connecteurs-des-outils-au-langage&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Each deposit becomes a &lt;strong&gt;canonical document&lt;/strong&gt; constructed from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repository name&lt;/li&gt;
&lt;li&gt;description&lt;/li&gt;
&lt;li&gt;README&lt;/li&gt;
&lt;li&gt;metadata (owner, topics…)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This document is then transformed via a classic text mining pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pretreatment (cleaning, tokenization)&lt;/li&gt;
&lt;li&gt;Feature Extraction&lt;/li&gt;
&lt;li&gt;TF-IDF Weighting&lt;/li&gt;
&lt;li&gt;Similarity between documents&lt;/li&gt;
&lt;li&gt;Classification / clustering&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This pipeline is directly inspired by historical approaches:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TF-IDF: &lt;code&gt;weight = tf * log(N / df)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Cosine similarity between documents&lt;/li&gt;
&lt;li&gt;Supervised Naive Bayes Classification&lt;/li&gt;
&lt;li&gt;Unsupervised k-means clustering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What interests us here is not the algorithm, but &lt;strong&gt;the way to orchestrate it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Note that if you are fond of documentation, you can refer to the Resources section at the bottom of the article which lists a number of topics concerning data mining applied in computer science.&lt;/p&gt;
&lt;h2&gt;
  
  
  Business pipeline (independent of orchestration)
&lt;/h2&gt;

&lt;p&gt;First and foremost, the core business needs to be isolated.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Repository → Document → Tokens → Features → TF-IDF → Similarity → Results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This pipeline represents a &lt;strong&gt;data transformation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Each step:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;takes a piece of data&lt;/li&gt;
&lt;li&gt;produces new data&lt;/li&gt;
&lt;li&gt;without strong dependence on an external context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is precisely where the two approaches diverge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Approach 1 Message-Oriented - Orchestration via Symfony Messenger
&lt;/h2&gt;

&lt;p&gt;In the Message-Oriented implementation, the pipeline is not expressed as a continuous data transformation.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;encapsulated in a message&lt;/strong&gt;, then executed via the Symfony bus.&lt;/p&gt;

&lt;h3&gt;
  
  
  Execution Model
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Command → Message Bus → Handler → PipelineService → Stages
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In concrete terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a CLI command triggers the execution&lt;/li&gt;
&lt;li&gt;A message is sent&lt;/li&gt;
&lt;li&gt;a handler takes care of the execution&lt;/li&gt;
&lt;li&gt;the core business remains centralized in a shared service
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;RunMessengerPipelineMessage
→ RunMessengerPipelineHandler
→ PipelineService
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Separation of responsibilities
&lt;/h2&gt;

&lt;p&gt;This implementation adheres to a key project constraint:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The core business is strictly shared between the two approaches&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Messenger contains &lt;strong&gt;no business logic&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;he only orchestrates the execution&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Actual Pipeline Executed
&lt;/h2&gt;

&lt;p&gt;The handler triggers a deterministic pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. ingest
2. preprocess
3. feature build
4. classification
5. clustering
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each step is executed in a common application service (&lt;code&gt;PipelineService&lt;/code&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Concepts introduced by Messenger
&lt;/h2&gt;

&lt;p&gt;The orchestration explicitly introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a message class&lt;/li&gt;
&lt;li&gt;a dedicated handler&lt;/li&gt;
&lt;li&gt;a dependence on the bus&lt;/li&gt;
&lt;li&gt;a dispatch layer
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Command → Message → Handler → Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These elements are &lt;strong&gt;specific to Messenger&lt;/strong&gt; and do not exist in the data-oriented model&lt;/p&gt;

&lt;h2&gt;
  
  
  Observability and debugging
&lt;/h2&gt;

&lt;p&gt;Messenger offers a natural debugging model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;message inspection&lt;/li&gt;
&lt;li&gt;middleware&lt;/li&gt;
&lt;li&gt;bus logging&lt;/li&gt;
&lt;li&gt;Extensibility towards async / queue
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Debug = niveau message + middleware
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Nature of the overhead
&lt;/h2&gt;

&lt;p&gt;In this MVP, the overhead is conceptually measurable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;introduction of an artificial message&lt;/li&gt;
&lt;li&gt;Indirection via handler&lt;/li&gt;
&lt;li&gt;the need to structure the execution around the bus&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But this overhead is &lt;strong&gt;located in the orchestration adapter&lt;/strong&gt;, not in the hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This approach transforms the pipeline into:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a &lt;strong&gt;distributed work unit&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;She favors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Symfony standardization&lt;/li&gt;
&lt;li&gt;extensibility towards async&lt;/li&gt;
&lt;li&gt;integration with the ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the cost of an additional layer of indirection.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conceptual Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ComputeTfIdfMessage&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;DocumentId&lt;/span&gt; &lt;span class="nv"&gt;$id&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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;final&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ComputeTfIdfHandler&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;__invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;ComputeTfIdfMessage&lt;/span&gt; &lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$document&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$message&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$vector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;tfidf&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;compute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$document&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;bus&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ComputeSimilarityMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$vector&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;h3&gt;
  
  
  Benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;strong decoupling&lt;/li&gt;
&lt;li&gt;resilience (retry, queue)&lt;/li&gt;
&lt;li&gt;native parallelization&lt;/li&gt;
&lt;li&gt;Symfony standard&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Structural Limitations
&lt;/h3&gt;

&lt;p&gt;The problem quickly becomes apparent:&lt;/p&gt;

&lt;p&gt;➡️ &lt;strong&gt;the message becomes an artificial envelope&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We manipulate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IDs&lt;/li&gt;
&lt;li&gt;persistent states&lt;/li&gt;
&lt;li&gt;indirect transitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem is simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data → transformation → data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the boilerplate&lt;/li&gt;
&lt;li&gt;implicit dependencies&lt;/li&gt;
&lt;li&gt;a loss of overall readability&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Approach 2 Data-Oriented - Orchestration via Navi (synchronous) and Flow (asynchronous)
&lt;/h2&gt;

&lt;p&gt;In the Data-Oriented implementation, the pipeline is expressed as an &lt;strong&gt;ordered sequence of actions applied to a context&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There is no message.&lt;/p&gt;

&lt;p&gt;There is no dispatch.&lt;/p&gt;

&lt;p&gt;There is only:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a piece of data&lt;/li&gt;
&lt;li&gt;a context&lt;/li&gt;
&lt;li&gt;a sequential transformation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Execution Model
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Command → WorkflowRunner → Actions → PipelineService → Data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In concrete terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a command triggers a workflow&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;WorkflowRunner&lt;/code&gt; executes a list of actions&lt;/li&gt;
&lt;li&gt;each action transforms a &lt;code&gt;Context&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The business services are identical to Messenger
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WorkflowRunner
→ PipelineStageAction[]
→ Context
→ PipelineService
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pipeline Structure
&lt;/h2&gt;

&lt;p&gt;The pipeline is explicitly defined as a sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[IngestAction,
 PreprocessAction,
 FeatureBuildAction,
 ClassificationAction,
 ClusteringAction]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each action:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;takes a &lt;code&gt;Context&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;applies a transformation&lt;/li&gt;
&lt;li&gt;returns a new &lt;code&gt;Context&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Nature of the Context
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;Context&lt;/code&gt; becomes the central object:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;it contains the pipeline status&lt;/li&gt;
&lt;li&gt;it evolves at each stage&lt;/li&gt;
&lt;li&gt;it is inspectable
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Context₀ → Context₁ → Context₂ → ... → Contextₙ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Concepts introduced by Flow
&lt;/h2&gt;

&lt;p&gt;This approach introduces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;explicit actions&lt;/li&gt;
&lt;li&gt;a runner&lt;/li&gt;
&lt;li&gt;an evolving context
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Data → Action → Data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Unlike Messenger:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no message&lt;/li&gt;
&lt;li&gt;no handler&lt;/li&gt;
&lt;li&gt;no bus&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Observability and debugging
&lt;/h2&gt;

&lt;p&gt;The debugging process changes completely in nature:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Debug = suite d’actions + snapshots de contexte
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Benefits :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;visible execution order&lt;/li&gt;
&lt;li&gt;inspectable intermediate state&lt;/li&gt;
&lt;li&gt;deterministic pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Nature of readability
&lt;/h2&gt;

&lt;p&gt;The pipeline can be directly read as a stream:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ingest → preprocess → features → classification → clustering
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without structural transformation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structural Overhead
&lt;/h2&gt;

&lt;p&gt;The cost introduced is different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;need for a Context&lt;/li&gt;
&lt;li&gt;abstraction via actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no envelope&lt;/li&gt;
&lt;li&gt;no bus detours&lt;/li&gt;
&lt;li&gt;no break in the data flow&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This approach transforms the pipeline into:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a &lt;strong&gt;series of data transformations&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;She favors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;immediate readability&lt;/li&gt;
&lt;li&gt;direct transformation of data&lt;/li&gt;
&lt;li&gt;absence of envelope&lt;/li&gt;
&lt;li&gt;deterministic pipeline&lt;/li&gt;
&lt;li&gt;ease of testing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Boundaries
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;less suitable for complex distributed systems&lt;/li&gt;
&lt;li&gt;requires strict discipline regarding the purity of the transformations&lt;/li&gt;
&lt;li&gt;Tooling less standard than Messenger&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Direct Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criteria&lt;/th&gt;
&lt;th&gt;Message-Oriented&lt;/th&gt;
&lt;th&gt;Data-Oriented&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mental model&lt;/td&gt;
&lt;td&gt;Events / Messages&lt;/td&gt;
&lt;td&gt;Data streams&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Readability&lt;/td&gt;
&lt;td&gt;fragmented&lt;/td&gt;
&lt;td&gt;linear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overhead&lt;/td&gt;
&lt;td&gt;high (messages, handlers)&lt;/td&gt;
&lt;td&gt;low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;excellent&lt;/td&gt;
&lt;td&gt;depends on the design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debug&lt;/td&gt;
&lt;td&gt;indirect&lt;/td&gt;
&lt;td&gt;direct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business coupling&lt;/td&gt;
&lt;td&gt;weak but diffuse&lt;/td&gt;
&lt;td&gt;strong but explicit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Appearance&lt;/th&gt;
&lt;th&gt;Messenger&lt;/th&gt;
&lt;th&gt;NaviFlow&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Central unit&lt;/td&gt;
&lt;td&gt;Message&lt;/td&gt;
&lt;td&gt;Context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orchestration&lt;/td&gt;
&lt;td&gt;Bus + Handler&lt;/td&gt;
&lt;td&gt;Runner + Actions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flow&lt;/td&gt;
&lt;td&gt;indirect&lt;/td&gt;
&lt;td&gt;direct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Debug&lt;/td&gt;
&lt;td&gt;message-centric&lt;/td&gt;
&lt;td&gt;data-centric&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overhead&lt;/td&gt;
&lt;td&gt;message + handler&lt;/td&gt;
&lt;td&gt;action + context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pipeline&lt;/td&gt;
&lt;td&gt;encapsulated&lt;/td&gt;
&lt;td&gt;explicit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Key point: the illusion of complexity
&lt;/h2&gt;

&lt;p&gt;In the case of text mining, each step is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pure&lt;/li&gt;
&lt;li&gt;determinist&lt;/li&gt;
&lt;li&gt;functional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TF-IDF → simple mathematical formula&lt;/li&gt;
&lt;li&gt;Similarity cosine → normalized dot product&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There is &lt;strong&gt;no natural need for messages&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The introduction of Messenger is therefore an &lt;strong&gt;architectural decision&lt;/strong&gt;, not a business necessity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main Insight
&lt;/h2&gt;

&lt;p&gt;Message-oriented transforms data into events.&lt;br&gt;&lt;br&gt;
Data-oriented technology transforms data into data.**&lt;/p&gt;

&lt;p&gt;In a system like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Message-Oriented adds a layer&lt;/li&gt;
&lt;li&gt;Data-Oriented reveals the model&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implications for Symfony
&lt;/h2&gt;

&lt;p&gt;Symfony is evolving towards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;async&lt;/li&gt;
&lt;li&gt;workers&lt;/li&gt;
&lt;li&gt;sidekicks (FrankenPHP)&lt;/li&gt;
&lt;li&gt;distributed orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But this raises a fundamental question:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Does everything have to be orchestrated via messages?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer depends on the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to use each approach
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Message-Oriented
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;distributed workflows&lt;/li&gt;
&lt;li&gt;long tasks&lt;/li&gt;
&lt;li&gt;resilient systems&lt;/li&gt;
&lt;li&gt;industry events&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Data-Oriented
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;analytical pipelines&lt;/li&gt;
&lt;li&gt;data transformations&lt;/li&gt;
&lt;li&gt;deterministic systems&lt;/li&gt;
&lt;li&gt;intensive calculations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Source code
&lt;/h2&gt;

&lt;p&gt;The project's source code is free and can be viewed here: &lt;a href="https://github.com/matyo91/omer-quotes" rel="noopener noreferrer"&gt;https://github.com/matyo91/omer-quotes&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;This project demonstrates one simple thing:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Orchestration is not neutral&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Two functionally identical implementations can produce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;radically different systems&lt;/li&gt;
&lt;li&gt;opposing cognitive costs&lt;/li&gt;
&lt;li&gt;divergent evolutionary capacities&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the case of text mining:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Message-Oriented makes things more complex&lt;/li&gt;
&lt;li&gt;Data-Oriented clarifie&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Symfony Messenger orchestrates a pipeline as a unit of work.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Darkwood Flow orchestrates a pipeline as a data transformation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Next
&lt;/h2&gt;

&lt;p&gt;The next step in the project is to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;extend the pipeline (clustering, classification)&lt;/li&gt;
&lt;li&gt;to integrate more advanced models&lt;/li&gt;
&lt;li&gt;expose an API&lt;/li&gt;
&lt;li&gt;compare actual performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But most importantly:&lt;/p&gt;

&lt;p&gt;👉 continue to question the form of the orchestration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Thank you for writing the article
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Omer's git repository for data and inspiration: &lt;a href="https://git.arkalo.ovh" rel="noopener noreferrer"&gt;https://git.arkalo.ovh&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Leverage Messenger to Improve Your Architecture - Tugdual Saunier for the article outline: &lt;a href="https://speakerdeck.com/tucksaun/tirez-profit-de-messenger-pour-ameliorer-votre-architecture" rel="noopener noreferrer"&gt;https://speakerdeck.com/tucksaun/tirez-profit-de-messenger-pour-ameliorer-votre-architecture&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Polytech Paris Sud (formerly IFIPS) 2008: Information Extraction from Texts Project - Document Classification by François Yvon and Alexandre Allauzen, carried out as a tutorial during the 2007/2008 academic year using the Perl language with Matthieu Beyou &lt;a href="https://www.linkedin.com/in/matthieu-beyou-9a425a32/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/matthieu-beyou-9a425a32/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Examples from friends on EIT topics and mathematical models applied to AI
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Claude just changed sales calls forever! (free skill) - Alexandra Spalato | AI Automation: &lt;a href="https://www.youtube.com/watch?v=FuVIGGWwYKY" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=FuVIGGWwYKY&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demystifying AI: A practical guide for PHP developers - Iana IATSUN - PHP Forum 2024: &lt;a href="https://www.youtube.com/watch?v=u-yrK_-%5C_p9g" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=u-yrK_-\_p9g&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Embeddings in PHP: Symfony AI in practice: &lt;a href="https://speakerdeck.com/lyrixx/embeddings-symfony-ai-en-pratique" rel="noopener noreferrer"&gt;https://speakerdeck.com/lyrixx/embeddings-symfony-ai-en-pratique&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Stack Overflow tags - automatic prediction using machine learning algorithms - Marco Berta: &lt;a href="https://www.youtube.com/watch?v=fFKXFDDjEJU" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=fFKXFDDjEJU&lt;/a&gt;
Help! I'm being asked to use AI! - Drupal Camp Grenoble 2026 - Alexandre Balmes: &lt;a href="https://speakerdeck.com/pocky/au-secours-on-me-demande-dutiliser-de-lia-drupal-camp-grenoble-2026" rel="noopener noreferrer"&gt;https://speakerdeck.com/pocky/au-secours-on-me-demande-dutiliser-de-lia-drupal-camp-grenoble-2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DeepMind's New AI Just Changed Science Forever - Two Minute Papers: &lt;a href="https://www.youtube.com/watch?v=Io_GqmbNBbY" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=Io_GqmbNBbY&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Langflow Models Are Smart. Data Is Everything. Building Context-Rich AI Systems with Unstructured: &lt;a href="https://www.youtube.com/watch?v=fNLUv6Pvc6w" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=fNLUv6Pvc6w&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;I am a legend: hacking hearthstone with machine learning - Elie Bursztein, Celine Bursztein: &lt;a href="https://elie.net/talk/i-am-a-legend" rel="noopener noreferrer"&gt;https://elie.net/talk/i-am-a-legend&lt;/a&gt;
Tell me something about myself that I don't yet know by Nathalie | A Voice That Carries: &lt;a href="https://x.com/Bonzai_Star/status/2031432381471797589" rel="noopener noreferrer"&gt;https://x.com/Bonzai_Star/status/2031432381471797589&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Future of AI as Seen by Yann LeCun
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Nobody realizes what Yann LeCun has just created - Grand Angle Nova: &lt;a href="https://www.youtube.com/watch?v=P-wAr687qxg" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=P-wAr687qxg&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;For those who are curious: Inaugural lecture by Yann LeCun - Deep Learning and Beyond: The New Challenges of AI - École nationale des ponts et chaussées: &lt;a href="https://www.youtube.com/watch?v=Z208NMP7_-0" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=Z208NMP7_-0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;What is knowledge made of? From Arthur Sarrazin &lt;a href="https://www.linkedin.com/in/arthursarazin" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/arthursarazin&lt;/a&gt; in &lt;a href="https://srzarthur.substack.com/p/what-is-knowledge-made-of" rel="noopener noreferrer"&gt;https://srzarthur.substack.com/p/what-is-knowledge-made-of&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>data</category>
      <category>distributedsystems</category>
      <category>systemdesign</category>
    </item>
    <item>
      <title>🤩 Unleach connectors - From Tools to Language</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Tue, 14 Apr 2026 07:17:40 +0000</pubDate>
      <link>https://dev.to/matyo91/unleach-connectors-from-tools-to-language-3lab</link>
      <guid>https://dev.to/matyo91/unleach-connectors-from-tools-to-language-3lab</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Automation has reached a paradox.&lt;/p&gt;

&lt;p&gt;We have never had so many tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;connectors&lt;/li&gt;
&lt;li&gt;workflows&lt;/li&gt;
&lt;li&gt;orchestration engines&lt;/li&gt;
&lt;li&gt;AI agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yet, something fundamental is still missing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We don’t have a language.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This article revisits a previous experiment around Composio and MCP, and introduces a new direction:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Automation should not be a workflow. It should be a language.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Revisiting the First Approach
&lt;/h2&gt;

&lt;p&gt;A year ago, an implementation was proposed to automate Gmail and Google Calendar using PHP agents, MCP, and Composio.&lt;/p&gt;

&lt;p&gt;The system relied on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tool exposure via MCP&lt;/li&gt;
&lt;li&gt;connector orchestration&lt;/li&gt;
&lt;li&gt;agent-driven execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While functional, this approach had structural limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tight coupling to specific providers (Composio)&lt;/li&gt;
&lt;li&gt;workflow-centric design&lt;/li&gt;
&lt;li&gt;lack of composability&lt;/li&gt;
&lt;li&gt;no abstraction of intent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This led to the archival of the original project:&lt;br&gt;
→ &lt;code&gt;composio-mcp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The problem was not the tools.&lt;/p&gt;

&lt;p&gt;The problem was the model.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Limits of Connectors
&lt;/h2&gt;

&lt;p&gt;Modern automation platforms provide access to hundreds of integrations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Composio&lt;/li&gt;
&lt;li&gt;Symfony Mate&lt;/li&gt;
&lt;li&gt;Kestra&lt;/li&gt;
&lt;li&gt;n8n&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each exposes capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;send email&lt;/li&gt;
&lt;li&gt;fetch data&lt;/li&gt;
&lt;li&gt;trigger workflows&lt;/li&gt;
&lt;li&gt;call APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, these systems share a common limitation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;They define &lt;strong&gt;how to connect&lt;/strong&gt;, not &lt;strong&gt;how to compute&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;They operate as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pipelines&lt;/li&gt;
&lt;li&gt;graphs&lt;/li&gt;
&lt;li&gt;sequences&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But not as a formal system.&lt;/p&gt;
&lt;h2&gt;
  
  
  Back to First Principles
&lt;/h2&gt;

&lt;p&gt;To redefine automation, we revisit two foundational models:&lt;/p&gt;
&lt;h3&gt;
  
  
  Church - The Language
&lt;/h3&gt;

&lt;p&gt;Lambda calculus defines computation as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;function abstraction&lt;/li&gt;
&lt;li&gt;function application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;λx.x + 1
(λx.x + 1)(5) = 6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key properties:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;functions are first-class&lt;/li&gt;
&lt;li&gt;no mutable state&lt;/li&gt;
&lt;li&gt;computation = evaluation&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Turing - The Execution
&lt;/h3&gt;

&lt;p&gt;The Turing machine defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how computation is executed&lt;/li&gt;
&lt;li&gt;how state evolves&lt;/li&gt;
&lt;li&gt;how instructions are processed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Equivalence
&lt;/h3&gt;

&lt;p&gt;The Church–Turing thesis states:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Any computation expressed as a Turing machine can be expressed in lambda calculus.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A New Model for Automation
&lt;/h2&gt;

&lt;p&gt;Applying this equivalence:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Lambda&lt;/td&gt;
&lt;td&gt;Language (intent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flow&lt;/td&gt;
&lt;td&gt;Execution (runtime)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connectors&lt;/td&gt;
&lt;td&gt;External primitives&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This leads to a new architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Intent → Lambda → Execution → Connector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Connect Flow
&lt;/h2&gt;

&lt;p&gt;A new system, &lt;strong&gt;connect-flow&lt;/strong&gt;, implements this model.&lt;/p&gt;

&lt;p&gt;It introduces three core domains:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. LambdaCapability
&lt;/h3&gt;

&lt;p&gt;Represents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a computation&lt;/li&gt;
&lt;li&gt;a composable expression&lt;/li&gt;
&lt;li&gt;a formal structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;λfetchemails.λuserId.fetchemails(userId)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Execution (Flow)
&lt;/h3&gt;

&lt;p&gt;Execution is delegated to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an orchestration engine&lt;/li&gt;
&lt;li&gt;supporting async and parallel computation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flow acts as the &lt;strong&gt;Turing machine&lt;/strong&gt; of the system.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. LanguageCapability
&lt;/h3&gt;

&lt;p&gt;A higher-level abstraction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transforms natural language into lambda expressions&lt;/li&gt;
&lt;li&gt;uses a local LLM (Ollama + Mistral)&lt;/li&gt;
&lt;li&gt;preserves privacy (RGPD-compliant)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  From Tools to Primitives
&lt;/h2&gt;

&lt;p&gt;In this model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Composio&lt;/li&gt;
&lt;li&gt;Symfony Mate&lt;/li&gt;
&lt;li&gt;n8n&lt;/li&gt;
&lt;li&gt;Kestra&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;are no longer central systems.&lt;/p&gt;

&lt;p&gt;They become:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;execution backends&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each tool becomes a primitive callable within lambda.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Example
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Lambda Execution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/console connect-flow:lambda:run &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;"λfetchemails.λuserId.fetchemails(userId)"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="nt"&gt;--args&lt;/span&gt; &lt;span class="s2"&gt;"[5]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a function taking &lt;code&gt;fetchemails&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;then &lt;code&gt;userId&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;applying &lt;code&gt;fetchemails(userId)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Natural Language → Lambda
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/console &lt;span class="nt"&gt;-vvv&lt;/span&gt; connect-flow:language:to-lambda &lt;span class="se"&gt;\&lt;/span&gt;
&lt;span class="s2"&gt;"fetch emails you have the tool 'fetchemails'"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Produces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;λfetchemails.fetchemails()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Traditional automation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Workflow → Tools → Execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This model:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Intent → Lambda → Flow → Connector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key Differences
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional&lt;/th&gt;
&lt;th&gt;Lambda-based&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Static workflows&lt;/td&gt;
&lt;td&gt;Dynamic composition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool-driven&lt;/td&gt;
&lt;td&gt;Language-driven&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider-dependent&lt;/td&gt;
&lt;td&gt;Provider-agnostic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard to scale&lt;/td&gt;
&lt;td&gt;Composable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Extending the Language
&lt;/h2&gt;

&lt;p&gt;Future iterations will introduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data mappers&lt;/li&gt;
&lt;li&gt;conditional logic&lt;/li&gt;
&lt;li&gt;loops&lt;/li&gt;
&lt;li&gt;HTTP primitives&lt;/li&gt;
&lt;li&gt;process execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;compose&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;fetch_emails&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;filter_important&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nx"&gt;send_email&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Relationship with Functional Programming
&lt;/h2&gt;

&lt;p&gt;This approach builds upon:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lambda calculus&lt;/li&gt;
&lt;li&gt;combinatory logic&lt;/li&gt;
&lt;li&gt;functional composition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As previously explored in:&lt;/p&gt;

&lt;p&gt;→ Lambda interpreter in PHP&lt;br&gt;
→ Y combinator implementations&lt;br&gt;
→ Flow execution model&lt;/p&gt;

&lt;h2&gt;
  
  
  Toward a Universal Execution Layer
&lt;/h2&gt;

&lt;p&gt;This architecture suggests a new category of systems:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Capability Composition Engines&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;connectors are interchangeable&lt;/li&gt;
&lt;li&gt;execution is abstracted&lt;/li&gt;
&lt;li&gt;intent is formalized&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Projet sources
&lt;/h2&gt;

&lt;p&gt;You can find sources of the project here : &lt;a href="https://github.com/matyo91/connect-flow" rel="noopener noreferrer"&gt;https://github.com/matyo91/connect-flow&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Automation has evolved from scripts to workflows.&lt;/p&gt;

&lt;p&gt;The next step is clear:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;From workflows to language.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By combining:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lambda (Church)&lt;/li&gt;
&lt;li&gt;Flow (Turing)&lt;/li&gt;
&lt;li&gt;Connectors (primitives)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;we obtain a system that is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;composable&lt;/li&gt;
&lt;li&gt;extensible&lt;/li&gt;
&lt;li&gt;formally grounded&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Automation is not a sequence of steps.&lt;br&gt;
It is a computation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And computation deserves a language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.darkwood.com/article/automating-gmail-and-google-calendar-with-php-agents" rel="noopener noreferrer"&gt;https://blog.darkwood.com/article/automating-gmail-and-google-calendar-with-php-agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/matyo91/composio-mcp" rel="noopener noreferrer"&gt;https://github.com/matyo91/composio-mcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://composio.dev/" rel="noopener noreferrer"&gt;https://composio.dev/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://symfony.com/doc/current/ai/components/platform.html" rel="noopener noreferrer"&gt;https://symfony.com/doc/current/ai/components/platform.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kestra.io/plugins" rel="noopener noreferrer"&gt;https://kestra.io/plugins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://n8n.io/integrations/" rel="noopener noreferrer"&gt;https://n8n.io/integrations/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://navi.darkwood.com/" rel="noopener noreferrer"&gt;https://navi.darkwood.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://flow.darkwood.com/" rel="noopener noreferrer"&gt;https://flow.darkwood.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>💡 I created a GDPR-compliant AI app in 1 hour with Symfony</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Fri, 03 Apr 2026 06:41:54 +0000</pubDate>
      <link>https://dev.to/matyo91/i-created-a-gdpr-compliant-ai-app-in-1-hour-with-symfony-3dpl</link>
      <guid>https://dev.to/matyo91/i-created-a-gdpr-compliant-ai-app-in-1-hour-with-symfony-3dpl</guid>
      <description>&lt;p&gt;Today, many developers use AI to generate code.&lt;/p&gt;

&lt;p&gt;The question we are addressing here is the following:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;How ​​to transform an idea into an executable system?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that's normal.&lt;/p&gt;

&lt;p&gt;Because we learned to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;coding features&lt;/li&gt;
&lt;li&gt;write functions&lt;/li&gt;
&lt;li&gt;connect APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But not to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;structuring an idea so that it can be executed&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At Darkwood, we never start with the code.&lt;/p&gt;

&lt;p&gt;We begin with a much more fundamental step:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;the reasoning&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this article, we will look at the following in concrete terms:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How to transform an idea into a usable unit&lt;/li&gt;
&lt;li&gt;How to use AI to execute this idea&lt;/li&gt;
&lt;li&gt;How to apply this in a real project: &lt;strong&gt;SketchUp Shape&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🧠 1. An idea is not code
&lt;/h2&gt;

&lt;p&gt;When you think:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;“Créer une application”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your reflex as a developer is often:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Okay, I’m going to code an API, a database, etc.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;👉 Bad starting point.&lt;/p&gt;

&lt;p&gt;An idea is not yet something you can execute.&lt;/p&gt;

&lt;p&gt;That's right:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 a &lt;strong&gt;vague intention&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  💡 The right mental model
&lt;/h2&gt;

&lt;p&gt;At Darkwood, we believe that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;one idea = one task&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No more, no less.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;“Créer une application”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;becomes :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task: create_app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It may seem trivial.&lt;/p&gt;

&lt;p&gt;But this is a significant change:&lt;/p&gt;

&lt;p&gt;👉 You no longer think in terms of “projects”&lt;br&gt;
👉 You think in &lt;strong&gt;executable units&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  ⚙️ Why this method works: Church, Turing, and the idea as an executable unit
&lt;/h1&gt;

&lt;p&gt;One might think that “prompting an AI” is a recent, almost purely practical topic, linked to current LLM news.&lt;/p&gt;

&lt;p&gt;In reality, the problem is much older.&lt;/p&gt;

&lt;p&gt;When a developer takes an idea and tries to turn it into an executable system, they always encounter the same question:&lt;/p&gt;

&lt;p&gt;How do we move from an abstract intention to a form that the machine can actually process?&lt;/p&gt;

&lt;p&gt;This is exactly the type of question that lies at the root of theoretical computer science.&lt;/p&gt;

&lt;p&gt;In a previous Darkwood article - &lt;a href="https://blog.darkwood.com/index.php/fr/article/create-a-lambda-interpreter-in-php-1" rel="noopener noreferrer"&gt;&lt;em&gt;Create a Lambda Interpreter in PHP&lt;/em&gt;&lt;/a&gt; - we already explored this boundary between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;the idea of ​​a calculation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;and &lt;strong&gt;its actual execution by a machine&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article started with Alonzo Church's λ-calculus, then linked it to the Turing machine, recalling a fundamental point:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The λ-calculus and the Turing machine are two equivalent models of computation&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Church provides a &lt;strong&gt;conceptual model&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Turing provides a &lt;strong&gt;model of execution&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that's exactly what interests us here.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧠 Church: before execution, a conceivable form is necessary
&lt;/h2&gt;

&lt;p&gt;Alonzo Church does not start from a machine.&lt;br&gt;
It stems from a much deeper problem:&lt;/p&gt;

&lt;p&gt;What is a function?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;and more broadly:&lt;/p&gt;

&lt;p&gt;What is a calculation?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The λ-calculus responds to this with a radical idea:&lt;/p&gt;

&lt;p&gt;Any calculation can be expressed as an abstraction and application of functions.&lt;/p&gt;

&lt;p&gt;In this model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A function is a transformation&lt;/li&gt;
&lt;li&gt;a value can be passed to another function&lt;/li&gt;
&lt;li&gt;and evaluation consists of applying functions to one another&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the theoretical root of many things we use today without thinking about it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;functional programming&lt;/li&gt;
&lt;li&gt;the currying&lt;/li&gt;
&lt;li&gt;closures&lt;/li&gt;
&lt;li&gt;the combinators&lt;/li&gt;
&lt;li&gt;pure transformations&lt;/li&gt;
&lt;li&gt;DSLs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the article on the lambda interpreter in PHP, this idea was presented in a very concrete way:&lt;br&gt;
We started with an expression, tokenized it, parsed it, built an AST, and then evaluated it.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;before a system executes something,&lt;br&gt;
First, it must &lt;strong&gt;understand a form&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is exactly the point that interests us regarding AI.&lt;/p&gt;

&lt;p&gt;When you give an LLM a sentence like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a house
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You haven't given it an execution yet.&lt;br&gt;
You give it an &lt;strong&gt;abstract form&lt;/strong&gt;, an intention, a request that is still insufficiently structured.&lt;/p&gt;

&lt;p&gt;And that's where Church's intuition becomes useful to us.&lt;/p&gt;
&lt;h3&gt;
  
  
  Developer translation
&lt;/h3&gt;

&lt;p&gt;When we talk about ideas in this article, we are not talking about vague inspiration or brainstorming.&lt;/p&gt;

&lt;p&gt;We are already talking about a &lt;strong&gt;manipulable abstraction&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;An idea must become a unit upon which a system can reason.&lt;/p&gt;

&lt;p&gt;That's why, at Darkwood, we make an initial mental shift:&lt;/p&gt;

&lt;p&gt;An idea is not yet code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An idea is already a transformation in progress.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or, to put it another way:&lt;/p&gt;

&lt;p&gt;An idea is a potential task&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚙️ Turing: once the form is defined, it must be executed
&lt;/h2&gt;

&lt;p&gt;Church formalizes calculation on the side of abstraction.&lt;br&gt;
Turing, however, answers a different question:&lt;/p&gt;

&lt;p&gt;What does a machine capable of performing this calculation look like?&lt;/p&gt;

&lt;p&gt;His answer is famous:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a memory strip&lt;/li&gt;
&lt;li&gt;a reading head&lt;/li&gt;
&lt;li&gt;a current state&lt;/li&gt;
&lt;li&gt;transition rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The power of the model does not come from its complexity, but rather from its simplicity.&lt;/p&gt;

&lt;p&gt;A Turing machine reads a cell, takes its state into account, applies a rule, possibly writes something, and then moves on.&lt;/p&gt;

&lt;p&gt;It's an extremely simple model, but sufficient to reason about what a machine can do.&lt;/p&gt;

&lt;p&gt;What interests us here is not teaching the entire theory of automata.&lt;br&gt;
It's about recovering a very concrete intuition:&lt;/p&gt;

&lt;p&gt;An executable system needs readable units.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;and a clear mechanism for switching from one state to the other&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is where the link with modern work on ideas, tasks, and AI agents becomes very concrete.&lt;/p&gt;
&lt;h2&gt;
  
  
  🔁 What Church and Turing teach us about working with AI
&lt;/h2&gt;

&lt;p&gt;The essential point is this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Church teaches us to think of calculation as &lt;strong&gt;transformation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Turing teaches us to think of computation as &lt;strong&gt;structured execution&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you combine the two, you get a much healthier way of working with AI.&lt;/p&gt;

&lt;p&gt;We stop thinking:&lt;/p&gt;

&lt;p&gt;“I’m going to ask the model for some code”&lt;/p&gt;

&lt;p&gt;And we start to think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’m going to give him a structured unit of work,&lt;br&gt;
that he will be able to transform,&lt;br&gt;
then another system can execute”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's exactly what we do at Darkwood.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧩 Darkwood translation: an idea becomes a task
&lt;/h2&gt;

&lt;p&gt;At this stage, we can simplify the model without betraying it.&lt;/p&gt;

&lt;p&gt;Here is the translation we are using as a basis:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theoretical concept&lt;/th&gt;
&lt;th&gt;Darkwood interpretation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Abstraction&lt;/td&gt;
&lt;td&gt;Structured idea&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Function&lt;/td&gt;
&lt;td&gt;Transformation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory slot&lt;/td&gt;
&lt;td&gt;Task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strip&lt;/td&gt;
&lt;td&gt;To-do list / stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read&lt;/td&gt;
&lt;td&gt;Execute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transition&lt;/td&gt;
&lt;td&gt;Change from one state to another&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This gives us a simple rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;an idea becomes a task&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a task becomes a readable unit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A readable unit can be executed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is this change of perspective that matters.&lt;/p&gt;

&lt;p&gt;Because as long as an idea remains only in your head, it is unusable by the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nor your terminal&lt;/li&gt;
&lt;li&gt;nor your IDE&lt;/li&gt;
&lt;li&gt;nor your LLM&lt;/li&gt;
&lt;li&gt;nor your orchestrator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;cannot work on it properly.&lt;/p&gt;

&lt;p&gt;It therefore needs to be given a form.&lt;/p&gt;
&lt;h2&gt;
  
  
  💡 The idea as a unit of calculation
&lt;/h2&gt;

&lt;p&gt;This is where our method becomes truly meaningful.&lt;/p&gt;

&lt;p&gt;When we say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Créer une application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's not a system yet.&lt;br&gt;
This is not yet architecture.&lt;br&gt;
This is not yet a usable prompt.&lt;/p&gt;

&lt;p&gt;But it's not "nothing" either.&lt;/p&gt;

&lt;p&gt;That's already it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a unit of calculation to be specified&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At Darkwood, we put it through a nomination and reduction stage.&lt;/p&gt;

&lt;p&gt;For example :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task: create_app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task: generate_sketchup_shape
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From this point on, the machine - or the system of agents - no longer manipulates just a human sentence.&lt;br&gt;
She is manipulating an identifiable task.&lt;/p&gt;

&lt;p&gt;And once you can identify a task, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;store it&lt;/li&gt;
&lt;li&gt;reread it&lt;/li&gt;
&lt;li&gt;reproduce it&lt;/li&gt;
&lt;li&gt;transmit it&lt;/li&gt;
&lt;li&gt;cut it&lt;/li&gt;
&lt;li&gt;parallelize it&lt;/li&gt;
&lt;li&gt;to orchestrate it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it, that's the real change.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧠 Why this is so useful for a developer
&lt;/h2&gt;

&lt;p&gt;A developer often tends to jump directly to implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create a folder&lt;/li&gt;
&lt;li&gt;Install Symfony&lt;/li&gt;
&lt;li&gt;connect an API&lt;/li&gt;
&lt;li&gt;write an order&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But if the initial idea has not been modeled correctly, everything else becomes unstable.&lt;/p&gt;

&lt;p&gt;This leads to what many people experience with LLMs today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vague prompts&lt;/li&gt;
&lt;li&gt;unclear outputs&lt;/li&gt;
&lt;li&gt;fragile structures&lt;/li&gt;
&lt;li&gt;projects that “work”, but lack coherence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The theory of Church and Turing reminds us of something very simple:&lt;/p&gt;

&lt;p&gt;The quality of the execution depends on the quality of the initial representation.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;If you want to improve the performance of an AI,&lt;br&gt;
First, you need to represent your idea better.&lt;/p&gt;

&lt;p&gt;And that's precisely what we're going to do next with SketchUp Shape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;starting from an intention&lt;/li&gt;
&lt;li&gt;convert it into a task&lt;/li&gt;
&lt;li&gt;to structure it&lt;/li&gt;
&lt;li&gt;transform it into a design&lt;/li&gt;
&lt;li&gt;then only in code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🧭 The rule to remember
&lt;/h2&gt;

&lt;p&gt;If this entire section had to be condensed into a single sentence, it would be this:&lt;/p&gt;

&lt;p&gt;A useful idea for AI is not an inspiration.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;It's a sufficiently clear abstraction to become an executable task&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that's where Church and Turing cease to be distant theory.&lt;/p&gt;

&lt;p&gt;They become a practical model for the modern developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Church helps you think about form&lt;/li&gt;
&lt;li&gt;Turing helps you think about execution&lt;/li&gt;
&lt;li&gt;Darkwood helps you connect the two&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  📚 Concrete example
&lt;/h1&gt;

&lt;p&gt;You have several ideas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- créer une app
- construire une API
- générer un modèle 3D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 You can represent them as a stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stack:
- create_app
- build_api
- generate_model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then, everything becomes simpler:&lt;/p&gt;

&lt;p&gt;You can handle each task &lt;strong&gt;one by one&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;in parallel&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  ⚡ 2. Your brain already works like this
&lt;/h1&gt;

&lt;p&gt;You don't need to learn a new system.&lt;/p&gt;

&lt;p&gt;👉 You're already using it.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Simple case: different tasks
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task A: répondre à un message
Task B: installer un package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 No link&lt;br&gt;
👉 You can easily switch between them&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚠️ Complicated case: similar tasks
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task A: coder une API
Task B: refactor la même API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 Now, things are getting tough&lt;/p&gt;

&lt;p&gt;For what ?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;same context&lt;/li&gt;
&lt;li&gt;same mental variables&lt;/li&gt;
&lt;li&gt;same files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;confusion&lt;/li&gt;
&lt;li&gt;errors&lt;/li&gt;
&lt;li&gt;fatigue&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  💥 What this implies
&lt;/h2&gt;

&lt;p&gt;Your brain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;has limited memory&lt;/li&gt;
&lt;li&gt;handles too much context poorly&lt;/li&gt;
&lt;li&gt;saturates quickly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 So:&lt;/p&gt;

&lt;p&gt;You can't manage many complex tasks at the same time.&lt;/p&gt;
&lt;h1&gt;
  
  
  🧩 3. The real problem: reproducibility
&lt;/h1&gt;

&lt;p&gt;A task is only valuable if you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;find her&lt;/li&gt;
&lt;li&gt;to revive it&lt;/li&gt;
&lt;li&gt;share it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Otherwise, it stays in your head&lt;br&gt;
👉 and she disappears&lt;/p&gt;
&lt;h2&gt;
  
  
  🧠 Darkwood Approach
&lt;/h2&gt;

&lt;p&gt;We introduce a simple idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;one task = one pointer&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  In concrete terms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You write your task in Joplin&lt;/li&gt;
&lt;li&gt;she has an ID&lt;/li&gt;
&lt;li&gt;This ID becomes your “pointer”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;in your terminal → you are referencing this task&lt;/li&gt;
&lt;li&gt;in your IDE → same&lt;/li&gt;
&lt;li&gt;in your AI → same&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Result:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;you manipulate &lt;strong&gt;the same object&lt;/strong&gt;, everywhere&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  💡 What this changes
&lt;/h2&gt;

&lt;p&gt;You no longer say:&lt;/p&gt;

&lt;p&gt;“I’m going to work on my idea.”&lt;/p&gt;

&lt;p&gt;You say:&lt;/p&gt;

&lt;p&gt;“I will carry out this task”&lt;/p&gt;

&lt;p&gt;And that's much more powerful.&lt;/p&gt;
&lt;h1&gt;
  
  
  ⚙️ 4. AI: not a magic tool, an execution system
&lt;/h1&gt;

&lt;p&gt;Today, many developers use AI like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“generate a function for me”&lt;/li&gt;
&lt;li&gt;“write me a class”&lt;/li&gt;
&lt;li&gt;“Fixes this bug”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 It works.&lt;/p&gt;

&lt;p&gt;But you remain within a certain logic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;responsive&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  🧠 Darkwood Approach
&lt;/h2&gt;

&lt;p&gt;We completely change the perspective:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 AI is becoming an &lt;strong&gt;execution system&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  🏗 We model like a business
&lt;/h2&gt;

&lt;p&gt;Rather than “magical agents”, a simple structure is used:&lt;/p&gt;
&lt;h3&gt;
  
  
  👤 You (human)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;you define the intention&lt;/li&gt;
&lt;li&gt;you pose the problem&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🧠 AI Architect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;he understands your intention&lt;/li&gt;
&lt;li&gt;he breaks it down into tasks&lt;/li&gt;
&lt;li&gt;he decides how to organize the system&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ⚙️ Agents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;they execute&lt;/li&gt;
&lt;li&gt;they produce code&lt;/li&gt;
&lt;li&gt;they transform the data&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  💡 Key Rule
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;The prompt = your intention&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your prompt is unclear:&lt;/p&gt;

&lt;p&gt;👉 the system is unclear&lt;/p&gt;

&lt;p&gt;If your prompt is structured:&lt;/p&gt;

&lt;p&gt;👉 the system becomes structured&lt;/p&gt;
&lt;h2&gt;
  
  
  🔥 Example
&lt;/h2&gt;

&lt;p&gt;❌ Bad prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;“Generate a house”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Good prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;“Create a structured architectural design of a house,
with walls, roof, proportions and constraints,
then generate SketchUp Ruby code from it”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Here, you give:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a direction&lt;/li&gt;
&lt;li&gt;a structure&lt;/li&gt;
&lt;li&gt;a clear objective&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  🧠 What you need to remember
&lt;/h1&gt;

&lt;p&gt;👉 You don't need to be better at coding&lt;/p&gt;

&lt;p&gt;👉 You need to get better at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structuring&lt;/li&gt;
&lt;li&gt;intention&lt;/li&gt;
&lt;li&gt;orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that's exactly what we're going to apply now with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;SketchUp Shape&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  🚀 5. Practical application: SketchUp Shape
&lt;/h1&gt;

&lt;p&gt;Project :&lt;br&gt;
👉 &lt;a href="https://github.com/matyo91/sketchup-shape" rel="noopener noreferrer"&gt;https://github.com/matyo91/sketchup-shape&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🎯 Objective
&lt;/h2&gt;

&lt;p&gt;Transformer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;“Create a house”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in:&lt;/p&gt;

&lt;p&gt;👉 Ruby script executable in &lt;a href="https://sketchup.trimble.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SketchUp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧱 Why SketchUp?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;3D modeling tool&lt;/li&gt;
&lt;li&gt;Documented Ruby API:
→ &lt;a href="https://ruby.sketchup.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SketchUp Ruby API&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;extensible (plugins, scripts)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎓 Context
&lt;/h2&gt;

&lt;p&gt;I personally learned SketchUp with&lt;br&gt;
&lt;a href="https://www.youtube.com/@sebastienmaison?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Sébastien Maison (YouTube)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 Here, the goal is not to use their AI:&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://sketchup.trimble.com/fr/ai-in-sketchup?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Official SketchUp AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 But to build &lt;strong&gt;our own system&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  ⚙️ 6. Pipeline: from idea to (concrete) 3D model
&lt;/h1&gt;

&lt;p&gt;Before going any further, let's take a real-life example.&lt;/p&gt;

&lt;p&gt;👉 Here, we're not talking about an abstract API&lt;br&gt;
👉 We're talking about &lt;strong&gt;generating a 3D object in SketchUp&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🧱 A little background: why SketchUp?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://sketchup.trimble.com/fr?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SketchUp&lt;/a&gt; is a widely used 3D modeling tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architecture&lt;/li&gt;
&lt;li&gt;design&lt;/li&gt;
&lt;li&gt;prototyping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personally, I discovered SketchUp thanks to &lt;a href="https://www.youtube.com/@sebastienmaison?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Sébastien Maison&lt;/a&gt;, with whom I took a course.&lt;/p&gt;

&lt;p&gt;👉 I modeled a house there “by hand”&lt;/p&gt;

&lt;p&gt;And that's where the idea came from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 “What if I could generate that directly with code?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  ⚠️ Why not use SketchUp's native AI?
&lt;/h2&gt;

&lt;p&gt;SketchUp already offers AI:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://sketchup.trimble.com/fr/ai-in-sketchup?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SketchUp AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But that's not the point here.&lt;/p&gt;

&lt;p&gt;👉 We are developers.&lt;/p&gt;

&lt;p&gt;👉 We want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;to understand&lt;/li&gt;
&lt;li&gt;control&lt;/li&gt;
&lt;li&gt;automate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So we go through:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;SketchUp Ruby API&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  🧠 The technical entrance
&lt;/h2&gt;

&lt;p&gt;To do this, SketchUp explains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.sketchup.com/learn?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Developer documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ruby.sketchup.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Ruby API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 In concrete terms:&lt;/p&gt;

&lt;p&gt;You write Ruby like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Sketchup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;active_model&lt;/span&gt;
&lt;span class="n"&gt;entities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entities&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;faces&lt;/li&gt;
&lt;li&gt;volumes&lt;/li&gt;
&lt;li&gt;groups&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧩 Resources used
&lt;/h2&gt;

&lt;p&gt;To make the AI ​​more reliable, I used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/SketchUp/ruby-api-stubs?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Ruby API Stubs&lt;/a&gt;&lt;br&gt;
👉 to give the LLM a clear view of the available objects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/SketchUp/sketchup-ruby-api-tutorials/tree/main/examples?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Official examples&lt;/a&gt;&lt;br&gt;
👉 to understand the real patterns&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you want to go further:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://extensions.sketchup.com/extension/add?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SketchUp Extensions&lt;/a&gt;&lt;br&gt;
→ You can package your code as a plugin&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚠️ Important prerequisite
&lt;/h2&gt;

&lt;p&gt;To run Ruby:&lt;/p&gt;

&lt;p&gt;👉 You must use the desktop version:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sketchup.trimble.com/fr/products/sketchup-pro/trial?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SketchUp Pro Trial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 The web version does not allow this (or only in very limited ways)&lt;/p&gt;
&lt;h1&gt;
  
  
  🔁 Pipeline Darkwood (applied)
&lt;/h1&gt;

&lt;p&gt;Now that we have the context, here is the actual pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Intention
   ↓
Design (LLM #1)
   ↓
Code (LLM #2)
   ↓
SketchUp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧠 Step 1: Intention
&lt;/h2&gt;

&lt;p&gt;You start with a simple idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/console app:generate-shape &lt;span class="s2"&gt;"Create a house"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Nothing more.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧱 Step 2: Design (LLM #1)
&lt;/h2&gt;

&lt;p&gt;Here, AI does not code.&lt;/p&gt;

&lt;p&gt;👉 She &lt;strong&gt;thinks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;She acts like an architect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"house"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"structure"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"walls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"roof"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 She decides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proportions&lt;/li&gt;
&lt;li&gt;elements&lt;/li&gt;
&lt;li&gt;of the structure&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚙️ Step 3: Code (LLM #2)
&lt;/h2&gt;

&lt;p&gt;Only then:&lt;/p&gt;

&lt;p&gt;👉 a second AI transforms this plan into code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_operation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'House'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit_operation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 She acts like a developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It uses the SketchUp API&lt;/li&gt;
&lt;li&gt;she constructs the geometry&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  ⚠️ 7. Why 2 LLMs (and not 1)
&lt;/h1&gt;

&lt;p&gt;This is one of the most important parts.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Naive approach
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;idée → code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 What you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inconsistent&lt;/li&gt;
&lt;li&gt;unpredictable&lt;/li&gt;
&lt;li&gt;difficult to correct&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ Darkwood Approach
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;idée → design → code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 You separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 the &lt;strong&gt;what&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;⚙️ the &lt;strong&gt;comment&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 It's exactly like in a team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architect → decides&lt;/li&gt;
&lt;li&gt;developer → implements&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  🧠 8. The real problem encountered
&lt;/h1&gt;

&lt;p&gt;When I launched:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Create a house
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;technically valid&lt;/li&gt;
&lt;li&gt;but visually… false&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 It wasn't a house&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Why?
&lt;/h2&gt;

&lt;p&gt;Because AI did this:&lt;/p&gt;

&lt;p&gt;“A house = shapes”&lt;/p&gt;

&lt;p&gt;👉 She stacked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cubes&lt;/li&gt;
&lt;li&gt;a roof&lt;/li&gt;
&lt;li&gt;without logic&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💥 The real problem
&lt;/h2&gt;

&lt;p&gt;AI doesn't understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gravity&lt;/li&gt;
&lt;li&gt;the proportions&lt;/li&gt;
&lt;li&gt;actual usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 She doesn't understand:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;what a house is&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🧠 Correction made
&lt;/h2&gt;

&lt;p&gt;A layer was introduced:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;structured design&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We force:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"house"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"foundation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"walls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roof"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"constraints"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"symmetry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"alignment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"centered"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consistency&lt;/li&gt;
&lt;li&gt;stability&lt;/li&gt;
&lt;li&gt;made credible&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  ⚙️ 10. Technical Stack
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🧱 Backend
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Symfony 8&lt;/li&gt;
&lt;li&gt;Symfony AI&lt;/li&gt;
&lt;li&gt;&lt;code&gt;darkwood/navi&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require darkwood/navi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧠 Local AI (GDPR)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mistral.ai/news/mistral-3" rel="noopener noreferrer"&gt;Mistral 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ollama.com/library/ministral-3" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 everything runs locally&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚖️ Why this is important
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;no external API&lt;/li&gt;
&lt;li&gt;no data leak&lt;/li&gt;
&lt;li&gt;total control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 You build a system:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GDPR compliant by design&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  ⚙️ 11. Orders
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🧠 Local LLM
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull ministral-3:8b
ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚙️ Generation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/console app:generate-shape &lt;span class="s2"&gt;"Create a house"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Useful Options
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-o&lt;/span&gt; house.rb        &lt;span class="c"&gt;# sauvegarde du script&lt;/span&gt;
&lt;span class="nt"&gt;--spec&lt;/span&gt; design.json &lt;span class="c"&gt;# sauvegarde du design&lt;/span&gt;
&lt;span class="nt"&gt;-v&lt;/span&gt;                 &lt;span class="c"&gt;# debug complet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🧠 12. What you really need to remember
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ❌ This is not:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;“How to use AI”&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ It is:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;How ​​to structure an idea so that an AI can execute it&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  🔁 Final Model
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;idée
 → tâche
 → design
 → code
 → exécution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🚀 Conclusion
&lt;/h1&gt;

&lt;p&gt;The future of development is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;write more code&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;structuring ideas&lt;br&gt;
and orchestrate their execution&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;👉 At Darkwood:&lt;/p&gt;

&lt;p&gt;we are not trying to go faster&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;we are trying to be fairer&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>php</category>
      <category>privacy</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🎨 Darkwood v1.0.4 - Présentation du design V4</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Mon, 16 Mar 2026 12:29:36 +0000</pubDate>
      <link>https://dev.to/matyo91/darkwood-v104-presentation-du-design-v4-3f4m</link>
      <guid>https://dev.to/matyo91/darkwood-v104-presentation-du-design-v4-3f4m</guid>
      <description>&lt;p&gt;Darkwood v1.0.4 est maintenant disponible.&lt;/p&gt;

&lt;p&gt;Cette version introduit Design V4, la quatrième itération visuelle majeure de Darkwood.&lt;/p&gt;

&lt;p&gt;Pour les nouveaux lecteurs, voici deux idées de versionnage différentes :&lt;/p&gt;

&lt;p&gt;v1.0.4 est la version du logiciel&lt;br&gt;
Design V4 est la quatrième évolution de l'interface de Darkwood&lt;br&gt;
Au fil des ans, Darkwood a connu plusieurs itérations de conception :&lt;/p&gt;

&lt;p&gt;V1 se concentrait sur la première identité visuelle&lt;br&gt;
V2 a exploré de nouvelles orientations de mise en page&lt;br&gt;
V3 a affiné la marque et la structure globale&lt;br&gt;
V4 remanie la navigation sur l'ensemble du site&lt;br&gt;
Cette version n'est donc pas « Darkwood version 4 » au sens du terme. Il s'agit de la version 1.0.4, qui introduit Darkwood Design V4.&lt;/p&gt;

&lt;p&gt;Et c'est important, car cette mise à jour ne se limite pas à une simple amélioration visuelle. Elle modernise également l'infrastructure technique et ouvre Darkwood aux flux de travail basés sur l'IA.&lt;/p&gt;

&lt;p&gt;Notes de version : &lt;a href="https://github.com/darkwood-com/darkwood-com/releases/tag/v1.0.4" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/darkwood-com/releases/tag/v1.0.4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qu'est-ce que Darkwood ?&lt;br&gt;
Darkwood est un jeu tactique axé sur les API.&lt;/p&gt;

&lt;p&gt;Il est conçu comme les deux :&lt;/p&gt;

&lt;p&gt;un système de jeu jouable&lt;br&gt;
un terrain de jeu technique&lt;br&gt;
une application Symfony conçue pour l'expérimentation à long terme&lt;br&gt;
L'idée de base est simple : le gameplay ne doit pas dépendre entièrement de l'interface graphique.&lt;/p&gt;

&lt;p&gt;L'interface utilisateur est importante, mais la logique du jeu réside avant tout dans l'API.&lt;/p&gt;

&lt;p&gt;Cette approche a été décrite précédemment ici : &lt;a href="https://blog.darkwood.com/article/darkwood-building-an-api-first-tactical-game" rel="noopener noreferrer"&gt;https://blog.darkwood.com/article/darkwood-building-an-api-first-tactical-game&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cette version s'inscrit dans cette continuité.&lt;/p&gt;

&lt;p&gt;Darkwood combine désormais :&lt;/p&gt;

&lt;p&gt;une interface repensée&lt;br&gt;
une pile PHP mise à jour&lt;br&gt;
et intégration MCP pour les agents d'IA&lt;br&gt;
Pourquoi concevoir V4 ?&lt;br&gt;
Au fil du temps, Darkwood a accumulé des couches.&lt;/p&gt;

&lt;p&gt;Des pages ont été ajoutées. Les expériences ont été intégrées. Navigation étendue.&lt;/p&gt;

&lt;p&gt;Le résultat était fonctionnel, mais pas toujours clair.&lt;/p&gt;

&lt;p&gt;La version 4 de Design se concentre sur un objectif principal :&lt;/p&gt;

&lt;p&gt;Redonner au navigateur un aspect naturel.&lt;/p&gt;

&lt;p&gt;Le changement le plus important entre la version V3 et la version V4 ne réside pas dans la marque elle-même. Il s'agit de la manière dont les utilisateurs naviguent sur le site.&lt;/p&gt;

&lt;p&gt;Les versions précédentes portaient principalement sur la mise en page et l'identité visuelle. Celui-ci concerne l'architecture de navigation.&lt;/p&gt;

&lt;p&gt;La nouvelle conception a d'abord été explorée avec Pencil, ce qui a permis d'accélérer les études d'interface et les décisions de mise en page avant la mise en œuvre.&lt;/p&gt;

&lt;p&gt;Elle bénéficie également directement des leçons apprises lors de la construction d'Uniflow.&lt;/p&gt;

&lt;p&gt;Chez Uniflow, un travail considérable a été consacré à l'amélioration de la clarté des menus sur ordinateur et mobile. Cette expérience a contribué à façonner le nouveau modèle de navigation de Darkwood.&lt;/p&gt;

&lt;p&gt;Une bonne façon de résumer cet état d'esprit est :&lt;/p&gt;

&lt;p&gt;Penser macro, agir micro.&lt;/p&gt;

&lt;p&gt;Au niveau macro, la plateforme a besoin d'une structure claire. Au niveau micro, chaque interaction doit rester simple.&lt;/p&gt;

&lt;p&gt;Voilà l’esprit qui anime le design V4.&lt;/p&gt;

&lt;p&gt;Qu'est-ce qui a changé dans l'interface ?&lt;br&gt;
Une nouvelle structure de navigation&lt;br&gt;
Le changement le plus visible concerne la navigation.&lt;/p&gt;

&lt;p&gt;Darkwood utilise désormais une navigation centrée en haut au lieu de l'ancienne structure latérale.&lt;/p&gt;

&lt;p&gt;Le site est organisé autour de quatre sections principales :&lt;/p&gt;

&lt;p&gt;Jouer - accéder au jeu tactique&lt;br&gt;
Monde - explorez l'univers et son contexte&lt;br&gt;
Journal - Consultez les articles techniques et les notes de développement&lt;br&gt;
Projets - Découvrez des expériences et des travaux connexes&lt;br&gt;
Cela rend la plateforme plus facile à comprendre au premier coup d'œil.&lt;/p&gt;

&lt;p&gt;Au lieu d'être fragmentée, l'expérience est désormais organisée autour de quatre points d'entrée clairement définis.&lt;/p&gt;

&lt;p&gt;La même logique est utilisée sur ordinateur et mobile, la navigation reste donc cohérente quel que soit l'appareil.&lt;/p&gt;

&lt;p&gt;Une tête plus légère&lt;br&gt;
L'en-tête a été repensé pour paraître plus léger et plus réfléchi.&lt;/p&gt;

&lt;p&gt;Elle reste disponible pendant le défilement, mais avec un poids visuel réduit.&lt;/p&gt;

&lt;p&gt;Le but n'était pas de le rendre plus décoratif. L'objectif était de le rendre plus utile.&lt;/p&gt;

&lt;p&gt;Un pied de page remanié&lt;br&gt;
Le pied de page a également été restructuré.&lt;/p&gt;

&lt;p&gt;Elle permet désormais de regrouper le contenu plus clairement tout en restant secondaire par rapport à la page elle-même.&lt;/p&gt;

&lt;p&gt;L'objectif était d'améliorer l'orientation sans que le pied de page ne domine l'expérience de lecture.&lt;/p&gt;

&lt;p&gt;Un système visuel plus cohérent&lt;br&gt;
La version 4 de Design introduit également un nettoyage plus global du site :&lt;/p&gt;

&lt;p&gt;espacement amélioré&lt;br&gt;
Hiérarchie de boutons plus claire&lt;br&gt;
meilleure navigation mobile&lt;br&gt;
Expérience de connexion améliorée&lt;br&gt;
Comportement de mise en page plus cohérent&lt;br&gt;
Il ne s'agit pas d'une refonte radicale. Il s'agit d'un passage de cohérence à travers l'expérience complète.&lt;/p&gt;

&lt;p&gt;Construit avec une pile mise à jour&lt;br&gt;
Cette version met également à jour les fondements techniques de Darkwood.&lt;/p&gt;

&lt;p&gt;Darkwood fonctionne désormais avec :&lt;/p&gt;

&lt;p&gt;PHP 8.5&lt;br&gt;
Symfony 8&lt;br&gt;
FrankenPHP v1.12.1&lt;br&gt;
Il comprend également :&lt;/p&gt;

&lt;p&gt;Migration des contrôleurs des annotations vers les attributs PHP&lt;br&gt;
Configuration Nix et CI mise à jour&lt;br&gt;
Mise à jour des recettes et de la configuration du framework&lt;br&gt;
Corrections de dépréciation concernant le groupe d'exceptions Darkwood IA&lt;br&gt;
Renforcement de la sécurité en production sur plusieurs points, notamment le référencement naturel, Castor, la sérialisation des utilisateurs, reCAPTCHA et l'intégration optionnelle de Baserow&lt;br&gt;
L'objectif est simple :&lt;/p&gt;

&lt;p&gt;Maintenir la plateforme à jour, rapide et facile à maintenir.&lt;/p&gt;

&lt;p&gt;Pas par mode. Pour sa durabilité.&lt;/p&gt;

&lt;p&gt;Darkwood devrait pouvoir se développer sans rencontrer de difficultés techniques évitables.&lt;/p&gt;

&lt;p&gt;Intégration MCP pour les flux de travail d'IA&lt;br&gt;
Cette version ajoute également l'intégration de l'outil MCP grâce aux nouvelles capacités d'IA de la plateforme API.&lt;/p&gt;

&lt;p&gt;Référence: &lt;a href="https://les-tilleuls.coop/blog/sortie-dapi-platform-4-3-rencontre-avec-lia" rel="noopener noreferrer"&gt;https://les-tilleuls.coop/blog/sortie-dapi-platform-4-3-rencontre-avec-lia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cela correspond naturellement à l'approche « API-first » de Darkwood.&lt;/p&gt;

&lt;p&gt;Si la logique du jeu existe déjà sous forme d'API, l'exposer à des agents d'IA devient une extension de la même philosophie.&lt;/p&gt;

&lt;p&gt;Autrement dit, le jeu tactique était déjà programmable. Il est désormais également prêt pour les agents.&lt;/p&gt;

&lt;p&gt;Outils MCP de DarkwoodGame&lt;br&gt;
La ressource API DarkwoodGame expose désormais quatre outils MCP :&lt;/p&gt;

&lt;p&gt;get_darkwood_state Renvoie l'état actuel du jeu&lt;/p&gt;

&lt;p&gt;darkwood_action Exécute une action de jeu à partir d'une entrée&lt;/p&gt;

&lt;p&gt;list_darkwood_archives Liste des captures d'écran archivées des puzzles pour les utilisateurs premium&lt;/p&gt;

&lt;p&gt;get_darkwood_archive Récupère une archive par identifiant pour les utilisateurs premium&lt;/p&gt;

&lt;p&gt;Tous utilisent une sortie de contenu structuré, ce qui signifie que la réponse de l'API est directement renvoyée sous forme de sortie de l'outil MCP.&lt;/p&gt;

&lt;p&gt;Aucune nouvelle route HTTP n'a été introduite pour cela.&lt;/p&gt;

&lt;p&gt;La couche MCP expose simplement les capacités API existantes de manière à ce que les agents d'IA puissent les exploiter sans problème.&lt;/p&gt;

&lt;p&gt;Outils MCP de l'article&lt;br&gt;
Les articles de Darkwood sont désormais également accessibles via MCP.&lt;/p&gt;

&lt;p&gt;Deux outils ont été ajoutés :&lt;/p&gt;

&lt;p&gt;list_articles&lt;br&gt;
get_article&lt;br&gt;
Cela permet aux agents d'IA de récupérer des données structurées d'articles tout en conservant les mêmes règles de sécurité que la ressource API elle-même.&lt;/p&gt;

&lt;p&gt;Là encore, l'objectif n'est pas de dupliquer l'application. Il s'agit de rendre le système existant accessible via une nouvelle couche d'interaction.&lt;/p&gt;

&lt;p&gt;Gratuit vs Premium&lt;br&gt;
Darkwood est actuellement en cours de développement en Bêta Saison 0.&lt;/p&gt;

&lt;p&gt;La proposition commerciale reste inchangée.&lt;/p&gt;

&lt;p&gt;Deux types de clés d'accès sont disponibles.&lt;/p&gt;

&lt;p&gt;🎟 Accès bêta (gratuit)&lt;br&gt;
Clé API personnelle&lt;br&gt;
Actions quotidiennes limitées&lt;br&gt;
Accès à l'état jouable actuel&lt;br&gt;
Accès aux archives impossible&lt;br&gt;
💎 Fondateur Premium&lt;br&gt;
Clé API personnelle&lt;br&gt;
Actions quotidiennes illimitées&lt;br&gt;
Accès aux instantanés archivés des puzzles&lt;br&gt;
Statut de soutien précoce&lt;br&gt;
Les archives sont des instantanés en lecture seule des états jouables antérieurs. Ils permettent de révéler l'état historique du jeu sans affecter la partie en cours.&lt;/p&gt;

&lt;p&gt;Édition limitée pour les fondateurs&lt;br&gt;
Cette version reste volontairement confidentielle.&lt;/p&gt;

&lt;p&gt;Disponible dès maintenant :&lt;/p&gt;

&lt;p&gt;5 clés d'accès bêta&lt;br&gt;
5 clés Fondateur Premium&lt;br&gt;
C'est tout.&lt;/p&gt;

&lt;p&gt;Il ne s'agit pas d'un lancement destiné au marché de masse. Il s'agit d'une version contrôlée destinée à valider le modèle.&lt;/p&gt;

&lt;p&gt;L'accès est géré par Bonzai :&lt;/p&gt;

&lt;p&gt;Accès bêta (gratuit) &lt;a href="https://www.bonzai.pro/matyo91/shop/yDxv_7247/darkwood-api-beta-access-free" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/yDxv_7247/darkwood-api-beta-access-free&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fondateur Premium &lt;a href="https://www.bonzai.pro/matyo91/shop/lQxn_7249/darkwood-api-founder-premium" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/lQxn_7249/darkwood-api-founder-premium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chaque clé est personnelle et peut être changée si nécessaire.&lt;/p&gt;

&lt;p&gt;Ce que cette publication signifie réellement&lt;br&gt;
Darkwood v1.0.4 est une version qui poursuit trois objectifs :&lt;/p&gt;

&lt;p&gt;rendre l'interface plus facile à naviguer&lt;br&gt;
Mettre à jour l'architecture technique selon les normes modernes&lt;br&gt;
Étendre le modèle de jeu basé sur les API aux agents d'IA via MCP&lt;br&gt;
Le design V4 correspond à la partie visible.&lt;/p&gt;

&lt;p&gt;Mais en coulisses, le projet se consolide et s'ouvre également.&lt;/p&gt;

&lt;p&gt;On peut désormais aborder ce même jeu tactique par le biais de :&lt;/p&gt;

&lt;p&gt;le site web&lt;br&gt;
l'API&lt;br&gt;
et les flux de travail pilotés par l'IA&lt;br&gt;
Cette continuité est importante.&lt;/p&gt;

&lt;p&gt;Darkwood ne se divise pas en idées distinctes. Cela devient plus cohérent.&lt;/p&gt;

&lt;p&gt;Découvrez la version&lt;br&gt;
Darkwood v1.0.4 est disponible.&lt;/p&gt;

&lt;p&gt;Il apporte Design V4, une pile Symfony et PHP modernisée, et une intégration MCP pour le jeu tactique axé sur les API.&lt;/p&gt;

&lt;p&gt;Explorez l'interface. Lisez le journal. Accédez à l'API. Ou commencez à jouer.&lt;/p&gt;

&lt;p&gt;Libérer: &lt;a href="https://github.com/darkwood-com/darkwood-com/releases/tag/v1.0.4" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/darkwood-com/releases/tag/v1.0.4&lt;/a&gt;&lt;/p&gt;

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