<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
    <title>kalizi.dev</title>
    <subtitle>Andrea Bondì (kalizi): Lead Software Engineer e Technical Advisor a Roma, di Palermo. Dieci anni tra ecommerce, web app e sistemi AI.</subtitle>
    <link rel="self" type="application/atom+xml" href="https://kalizi.dev/it/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://kalizi.dev"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-06-21T00:00:00+00:00</updated>
    <id>https://kalizi.dev/it/atom.xml</id>
    <entry xml:lang="it">
        <title>Sull&#x27;essere Agent Ready</title>
        <published>2026-06-21T00:00:00+00:00</published>
        <updated>2026-06-21T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/on-being-agent-ready/"/>
        <id>https://kalizi.dev/it/blog/on-being-agent-ready/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/on-being-agent-ready/">&lt;p&gt;Ho scoperto di recente &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;isitagentready.com&#x2F;&quot;&gt;Is Your Site Agent Ready&lt;&#x2F;a&gt;, un sito di CloudFlare che ti dice quanto il tuo sito sia davvero... agent ready.&lt;&#x2F;p&gt;
&lt;p&gt;&quot;Che figata&quot;, ho pensato. Poi qualcosa ha preso il sopravvento. Uso LLM e agenti ogni giorno e sanno leggere HTML, quindi ho deciso di andare a fondo per capire meglio cosa significhi davvero essere agent ready. Per loro, almeno.&lt;&#x2F;p&gt;
&lt;p&gt;Apro la homepage: &quot;What do we check?&quot;, &quot;What&#x27;s the easiest way to improve my score?&quot;, &quot;Where can I learn more?&quot;. C&#x27;è roba, facile da leggere. MA i miei occhi cadono su un piccolo testo in fondo: &lt;strong&gt;&quot;These are AI-generated recommendations. AI can make mistakes. Please use your professional judgment when implementing these tips...&quot;&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Ricapitoliamo: questo è un sito AI per verificare se il tuo sito è &quot;AI ready&quot; e, siccome le raccomandazioni sono generate dall&#x27;AI, non dovresti fidarti ciecamente? Adoro l&#x27;intelligenza artificiale, ma un po&#x27; di &lt;strong&gt;HI&lt;&#x2F;strong&gt; (&lt;strong&gt;Human Intelligence&lt;&#x2F;strong&gt;) in più non guasterebbe.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;baseline&quot;&gt;Baseline&lt;&#x2F;h2&gt;
&lt;p&gt;Da ingegnere SW non posso fermarmi qui: devo sapere di più, devo misurare, devo impostare un esperimento per capire meglio e arrivare a conclusioni appropriate.&lt;&#x2F;p&gt;
&lt;p&gt;Farò tutto l&#x27;esperimento usando ovviamente questo sito: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;kalizi.dev&quot;&gt;Kalizi.dev&lt;&#x2F;a&gt;. È dietro CloudFlare, quindi loro ce l&#x27;hanno già: archiviato, copiato, salvato, in cache, versionato. Lo conoscono, ne hanno visto ogni versione. E sanno ovviamente se qualche agente lo ha letto nel tempo. Spoiler: Google, Amazon, Anthropic, OpenAI, Microsoft, ByteDance e Huawei l&#x27;hanno fatto. Sono lusingato. La prossima volta mi aspetto almeno un caffè.&lt;&#x2F;p&gt;









&lt;picture class=&quot;blog-picture&quot;&gt;
  &lt;source
    type=&quot;image&#x2F;avif&quot;
    srcset=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;baseline.e1bafba66c27e547.avif 480w, https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;baseline.ebd3d633e147d42d.avif 960w&quot;
    sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
  &gt;
  &lt;source
    type=&quot;image&#x2F;webp&quot;
    srcset=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;baseline.e36e54dafa995805.webp 480w, https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;baseline.5ee7b9834f805c30.webp 960w&quot;
    sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
  &gt;
  &lt;img
    src=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;baseline.43af547392dadf55.jpg&quot;
    width=&quot;960&quot;
    height=&quot;772&quot;
    alt=&quot;Baseline evaluation if kalizi.dev on being agent ready. Score 21&amp;#x2F;100&quot;
    loading=&quot;lazy&quot;
    decoding=&quot;async&quot;
  &gt;
&lt;&#x2F;picture&gt;
&lt;p&gt;Comunque, ho ottenuto una valutazione di base di 21 su 100: dicono che è &quot;Basic Web Presence&quot; (Livello 1).&lt;&#x2F;p&gt;
&lt;h2 id=&quot;basic-web-presence&quot;&gt;Basic Web Presence&lt;&#x2F;h2&gt;
&lt;p&gt;Il punteggio è pesato su 5 sezioni:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Discoverability&lt;&#x2F;strong&gt;: 50 (2 su 4)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Content&lt;&#x2F;strong&gt;: 0 (0 su 1)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Bot Access Control&lt;&#x2F;strong&gt;: 50 (1 su 2)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;API, Auth, MCP &amp;amp; Skill Discovery&lt;&#x2F;strong&gt;: 0 (0 su 7)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Commerce&lt;&#x2F;strong&gt;: non verificato (questo non è un sito e-commerce)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Ma c&#x27;era ancora un&#x27;idea che girava in testa. Fermiamoci un momento e pensiamo a cos&#x27;è un agente AI. Oggi, quando si parla di AI Agent si intende generalmente potenziare un LLM con la capacità di svolgere compiti e usare strumenti in un loop.&lt;&#x2F;p&gt;
&lt;p&gt;Se decostruiamo un agente nei suoi componenti base, abbiamo una serie di messaggi e strumenti avvolti in un loop che continua finché l&#x27;LLM decide che ha finito. Qualcosa del genere, per chi vuole essere tecnico:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;python&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;messages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt; [&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;    {&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;role&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;user&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;content&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt; input&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;()}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;task_complete&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #FAB387;&quot;&gt; False&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;while not&lt;&#x2F;span&gt;&lt;span&gt; task_complete&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    response&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; llm&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;messages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    task_complete&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; response&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;task_complete&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; response&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;should_call_tool&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        tool_result&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt; call_tool&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;            name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;response&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tool_name&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #EBA0AC;font-style: italic;&quot;&gt;            args&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;response&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;tool_args&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;        )&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        messages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;append&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;({&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;            &amp;quot;role&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;assistant&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;            &amp;quot;content&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; response&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;reasoning_or_request&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;        })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        messages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;append&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;({&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;            &amp;quot;role&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;tool&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;            &amp;quot;content&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; tool_result&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;        })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #CBA6F7;&quot;&gt;    else&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        output&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; response&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span&gt;output&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        messages&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;append&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;({&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;            &amp;quot;role&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt; &amp;quot;assistant&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;,&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;            &amp;quot;content&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt; output&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;        })&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #FAB387;font-style: italic;&quot;&gt;print&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;(&lt;&#x2F;span&gt;&lt;span&gt;output&lt;&#x2F;span&gt;&lt;span style=&quot;color: #9399B2;&quot;&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Il nucleo è SEMPRE l&#x27;LLM.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;un-llm-puo-leggere-questo-sito&quot;&gt;Un LLM può leggere questo sito?&lt;&#x2F;h2&gt;
&lt;p&gt;La maggior parte degli LLM di frontiera sono già agenti: non ti danno solo una risposta ma possono usare strumenti e svolgere compiti per te. Quindi li ho interrogati tutti, con lo stesso prompt, per vedere se riuscivano a leggere questo sito.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;chatgpt&quot;&gt;ChatGPT&lt;&#x2F;h3&gt;









&lt;picture class=&quot;blog-picture&quot;&gt;
  &lt;source
    type=&quot;image&#x2F;avif&quot;
    srcset=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;chatgpt.4fdc4d85a7936e2f.avif 480w, https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;chatgpt.d7428e4dd6b4f07e.avif 960w&quot;
    sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
  &gt;
  &lt;source
    type=&quot;image&#x2F;webp&quot;
    srcset=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;chatgpt.0e0b9e2fbdf91d10.webp 480w, https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;chatgpt.22ce8d77bd342af0.webp 960w&quot;
    sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
  &gt;
  &lt;img
    src=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;chatgpt.d3affd8693d9677b.jpg&quot;
    width=&quot;960&quot;
    height=&quot;962&quot;
    alt=&quot;Screenshot of ChatGPT parsing content of Kalizi.dev&quot;
    loading=&quot;lazy&quot;
    decoding=&quot;async&quot;
  &gt;
&lt;&#x2F;picture&gt;
&lt;p&gt;Sembra che ChatGPT ce la faccia.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;claude&quot;&gt;Claude&lt;&#x2F;h3&gt;









&lt;picture class=&quot;blog-picture&quot;&gt;
  &lt;source
    type=&quot;image&#x2F;avif&quot;
    srcset=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;claude.ac88e1764b78838c.avif 480w, https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;claude.6e772fde166e8c59.avif 960w&quot;
    sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
  &gt;
  &lt;source
    type=&quot;image&#x2F;webp&quot;
    srcset=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;claude.332f97c9a107e1f7.webp 480w, https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;claude.8a9ae3a5f37ed40c.webp 960w&quot;
    sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
  &gt;
  &lt;img
    src=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;claude.35314ac3303326f4.jpg&quot;
    width=&quot;960&quot;
    height=&quot;672&quot;
    alt=&quot;Screenshot of Claude parsing content of Kalizi.dev&quot;
    loading=&quot;lazy&quot;
    decoding=&quot;async&quot;
  &gt;
&lt;&#x2F;picture&gt;
&lt;p&gt;Anche Claude.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;gemini&quot;&gt;Gemini&lt;&#x2F;h3&gt;









&lt;picture class=&quot;blog-picture&quot;&gt;
  &lt;source
    type=&quot;image&#x2F;avif&quot;
    srcset=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;gemini.9c188cdfc567570b.avif 480w, https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;gemini.de28ecb82cedefaf.avif 960w&quot;
    sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
  &gt;
  &lt;source
    type=&quot;image&#x2F;webp&quot;
    srcset=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;gemini.2ab71fec9c9c292b.webp 480w, https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;gemini.a0152339747a7adf.webp 960w&quot;
    sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
  &gt;
  &lt;img
    src=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;gemini.95eddc42ec07ae64.jpg&quot;
    width=&quot;960&quot;
    height=&quot;542&quot;
    alt=&quot;Screenshot of Gemini parsing content of Kalizi.dev&quot;
    loading=&quot;lazy&quot;
    decoding=&quot;async&quot;
  &gt;
&lt;&#x2F;picture&gt;
&lt;p&gt;Pure Gemini.&lt;&#x2F;p&gt;
&lt;p&gt;Proviamo qualcosa di meno &quot;corporate&quot;.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;deepseek&quot;&gt;Deepseek&lt;&#x2F;h3&gt;









&lt;picture class=&quot;blog-picture&quot;&gt;
  &lt;source
    type=&quot;image&#x2F;avif&quot;
    srcset=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;deepseek.5904d39260e56e36.avif 480w, https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;deepseek.4f0794df298df97f.avif 960w&quot;
    sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
  &gt;
  &lt;source
    type=&quot;image&#x2F;webp&quot;
    srcset=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;deepseek.21016756fe482a7b.webp 480w, https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;deepseek.76fb32bf529443a0.webp 960w&quot;
    sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
  &gt;
  &lt;img
    src=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;deepseek.1fb92d47f34588c6.jpg&quot;
    width=&quot;960&quot;
    height=&quot;683&quot;
    alt=&quot;Screenshot of Deepseek parsing content of Kalizi.dev&quot;
    loading=&quot;lazy&quot;
    decoding=&quot;async&quot;
  &gt;
&lt;&#x2F;picture&gt;
&lt;p&gt;Anche Deepseek sembra leggere il contenuto.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;mistral&quot;&gt;Mistral&lt;&#x2F;h3&gt;









&lt;picture class=&quot;blog-picture&quot;&gt;
  &lt;source
    type=&quot;image&#x2F;avif&quot;
    srcset=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;mistral.9d94bbcacd775c48.avif 480w, https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;mistral.a05ea5e1a4b6f355.avif 960w&quot;
    sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
  &gt;
  &lt;source
    type=&quot;image&#x2F;webp&quot;
    srcset=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;mistral.fd6afee9c330457b.webp 480w, https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;mistral.b0cf495175804562.webp 960w&quot;
    sizes=&quot;(max-width: 800px) 100vw, 800px&quot;
  &gt;
  &lt;img
    src=&quot;https:&amp;#x2F;&amp;#x2F;kalizi.dev&amp;#x2F;processed_images&amp;#x2F;mistral.136afc999da57d14.jpg&quot;
    width=&quot;960&quot;
    height=&quot;504&quot;
    alt=&quot;Screenshot of Mistral parsing content of Kalizi.dev&quot;
    loading=&quot;lazy&quot;
    decoding=&quot;async&quot;
  &gt;
&lt;&#x2F;picture&gt;
&lt;p&gt;Persino Mistral l&#x27;ha letto.&lt;&#x2F;p&gt;
&lt;p style=&quot;text-align: center;&quot;&gt;· · ·&lt;&#x2F;p&gt;
&lt;p&gt;Proprio tutti.&lt;&#x2F;p&gt;
&lt;p&gt;Cinque LLM diversi, dai grandi nomi corporate alle alternative open-source più spigliate, hanno letto e capito questo sito. Zero configurazione speciale. Nessun header, nessuna markdown negotiation, nessun record DNS. Solo HTML.&lt;&#x2F;p&gt;
&lt;p&gt;Il che solleva la domanda ovvia: se gli agenti riescono già a leggere il sito senza problemi, su cosa stavo prendendo 21 su 100?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;allora-cosa-misurano-questi-punteggi&quot;&gt;Allora cosa misurano questi punteggi?&lt;&#x2F;h2&gt;
&lt;p&gt;Scomponiamoli.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;discoverability&quot;&gt;Discoverability&lt;&#x2F;h3&gt;
&lt;p&gt;Questo punteggio ha 4 controlli:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;robots.txt&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;Sitemap&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;Link headers&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;DNS for AI Discovery (DNS-AID)&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;L&#x27;obiettivo dichiarato di &lt;code&gt;robots.txt&lt;&#x2F;code&gt; è: &lt;em&gt;Pubblica &#x2F;robots.txt con regole di crawl chiare&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;User-agent: *&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Disallow:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Allow: &#x2F;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Sitemap: https:&#x2F;&#x2F;kalizi.dev&#x2F;sitemap.xml&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Non vedo letteralmente nulla di specifico per gli agenti.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Pubblica una sitemap e referenziala da robots.txt&lt;&#x2F;em&gt;. Anche qui, niente che non faresti normalmente.&lt;&#x2F;p&gt;
&lt;p&gt;I Link Headers sono il primo punto su cui questo sito non è pronto. &lt;strong&gt;Obiettivo: Includi header HTTP Link per la scoperta degli agenti (&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.rfc-editor.org&#x2F;info&#x2F;rfc8288&#x2F;&quot;&gt;RFC 8288&lt;&#x2F;a&gt;)&lt;&#x2F;strong&gt;. L&#x27;RFC è lungo 48 pagine stampabili, ha 7 capitoli e 3 appendici. In breve: quando il server invia una pagina, dovrebbe includere uno o più header HTTP &lt;code&gt;Link: ...&lt;&#x2F;code&gt; che indicano ad agenti AI, o ad altri software, dove trovare risorse leggibili dalla macchina sul tuo sito o API.&lt;&#x2F;p&gt;
&lt;p&gt;Quindi il server dovrebbe mandare qualcosa del tipo:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Link: &amp;lt;&#x2F;me&amp;gt;; rel=&amp;quot;author&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Link: &amp;lt;&#x2F;projects&amp;gt;; rel=&amp;quot;collection&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Link: &amp;lt;&#x2F;blog&amp;gt;; rel=&amp;quot;collection&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In seguito, lo standard HTML ha introdotto il suo modo di farlo, quindi dovrebbe esserci anche qualcosa come:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F9E2AF;&quot;&gt; rel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;me&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F9E2AF;&quot;&gt; href&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;https:&#x2F;&#x2F;github.com&#x2F;kalizi&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #89B4FA;&quot;&gt;link&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F9E2AF;&quot;&gt; rel&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;me&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #F9E2AF;&quot;&gt; href&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: #A6E3A1;&quot;&gt;&amp;quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;in&#x2F;kalizi-dev&#x2F;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: #94E2D5;&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Diamo un&#x27;occhiata al DNS-AID prima di andare avanti. &lt;strong&gt;Obiettivo: Pubblica record DNS for AI Discovery (DNS-AID) per la scoperta degli agenti tramite DNS&lt;&#x2F;strong&gt;. Si riferisce all&#x27;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.rfc-editor.org&#x2F;rfc&#x2F;rfc9460&quot;&gt;RFC 9460&lt;&#x2F;a&gt;. Altre 48 pagine.&lt;&#x2F;p&gt;
&lt;p&gt;Questa volta dice di aggiungere un nuovo record DNS &lt;code&gt;SVCB&lt;&#x2F;code&gt; per dare ai browser istruzioni extra e velocizzare il caricamento del sito. Puoi indicare:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;usa questo sottodominio&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;example.com. HTTPS 0 svc.example.net.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;usa questa porta non standard&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;example.com. HTTPS 1 . port=8443&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ul&gt;
&lt;li&gt;controlla questi indirizzi IP&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;example.com. HTTPS 1 . ipv4hint=192.0.2.10 ipv6hint=2001:db8::10&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Quindi...&lt;&#x2F;p&gt;
&lt;p&gt;Siccome il sito è dietro Cloudflare, non posso toccare nulla nell&#x27;&lt;code&gt;SVCB&lt;&#x2F;code&gt; senza rischiare di rompere la configurazione di caching o HTTPS di Cloudflare, o di esporre l&#x27;IP (non che sia un dramma, ci sono mille altri modi per trovarlo, ma a che serve il proxy se poi suggerisco l&#x27;IP direttamente?). E abbiamo davvero bisogno dei link? Può essere più veloce per qualche software, ma lo è per un agente? Gli agenti e gli LLM sono progettati per essere intelligenti, &lt;em&gt;sanno&lt;&#x2F;em&gt; cosa stanno cercando e possono tranquillamente ignorare i link.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;content&quot;&gt;Content&lt;&#x2F;h3&gt;
&lt;p&gt;Qui c&#x27;è un solo punto chiave: la Markdown Negotiation. &lt;strong&gt;Obiettivo: Restituire le risposte HTML in markdown quando gli agenti lo richiedono&lt;&#x2F;strong&gt;. Viene direttamente dalla &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;developers.cloudflare.com&#x2F;fundamentals&#x2F;reference&#x2F;markdown-for-agents&#x2F;&quot;&gt;documentazione di Cloudflare&lt;&#x2F;a&gt; e NON da un RFC.&lt;&#x2F;p&gt;
&lt;p&gt;Questo punto è in qualche modo controverso: è solo una proposta, non ci sono prove specifiche che &lt;code&gt;Accept: text&#x2F;markdown&lt;&#x2F;code&gt; venga usato da qualche agente, tranne nelle &lt;em&gt;osservazioni&lt;&#x2F;em&gt; di Cloudflare.&lt;&#x2F;p&gt;
&lt;p&gt;Anche OpenCode ha una &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;anomalyco&#x2F;opencode&#x2F;issues&#x2F;13486&quot;&gt;issue aperta&lt;&#x2F;a&gt; sull&#x27;argomento, ma non è ancora implementata.&lt;&#x2F;p&gt;
&lt;p&gt;Il markdown è un formato fantastico, lo uso moltissimo con gli agenti, e anche se potrebbe aiutare gli LLM, potrebbero comunque preferire l&#x27;HTML per verificare altri elementi: tag nascosti, link, dati embedded come payload JSON e simili.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;bot-access-control&quot;&gt;Bot Access Control&lt;&#x2F;h3&gt;
&lt;p&gt;Qui abbiamo il &quot;Bot Access Control&quot;. &lt;strong&gt;Obiettivo: Aggiungi regole User-agent per i crawler AI come GPTBot, Claude-Web e altri&lt;&#x2F;strong&gt;. La parte divertente è leggere il risultato: &lt;strong&gt;No AI-specific bot rules; wildcard rules apply to all crawlers including AI bots&lt;&#x2F;strong&gt;. Ok!&lt;&#x2F;p&gt;
&lt;p&gt;Il punto successivo è la &quot;Web Bot Auth request signing&quot;. Non gestisco bot. Saltato.&lt;&#x2F;p&gt;
&lt;p&gt;L&#x27;ultimo è curioso, il suo obiettivo recita &lt;strong&gt;Dichiara le preferenze di utilizzo dei contenuti AI con Content Signals nel robots.txt&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;PREFERENZE&lt;&#x2F;u&gt;&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Ecco un esempio di Cloudflare:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color: #CDD6F4; background-color: #1E1E2E;&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Content-Signal: ai-train=no, search=yes, ai-input=no&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;È solo una preferenza, non un&#x27;imposizione, quindi... posso dire che la trovo inutile?&lt;&#x2F;p&gt;
&lt;h3 id=&quot;api-auth-mcp-skill-discovery&quot;&gt;API, Auth, MCP &amp;amp; Skill Discovery&lt;&#x2F;h3&gt;
&lt;p&gt;Si potrebbe parlare a lungo di questa sezione. Ma in breve: questo sito non espone API, non ha autenticazione, non ha funzionalità specifiche, quindi è tutto irrilevante per questo scopo.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;agent-ready-per-cosa&quot;&gt;Agent Ready per cosa?&lt;&#x2F;h2&gt;
&lt;p&gt;Ecco il punto: tutti quegli LLM hanno letto questo sito senza problemi. Nessun header speciale, nessuna markdown negotiation, nessun record DNS-AID. Hanno analizzato l&#x27;HTML, capito il contenuto, risposto a domande su di esso.&lt;&#x2F;p&gt;
&lt;p&gt;Quindi perché 21&#x2F;100?&lt;&#x2F;p&gt;
&lt;p&gt;Perché &quot;agent ready&quot; non riguarda davvero la leggibilità. Riguarda l&#x27;&lt;strong&gt;azionabilità&lt;&#x2F;strong&gt;. C&#x27;è una differenza, e conta.&lt;&#x2F;p&gt;
&lt;p&gt;Un LLM che legge il tuo sito è un&#x27;operazione passiva: fetch, parse, comprensione. Gli LLM moderni sono molto bravi in questo. L&#x27;HTML leggibile è sufficiente.&lt;&#x2F;p&gt;
&lt;p&gt;&quot;Agent ready&quot; nel senso di Cloudflare significa qualcosa di completamente diverso: &lt;strong&gt;un agente AI può fare cose sul tuo sito?&lt;&#x2F;strong&gt; Può autenticarsi, chiamare un&#x27;API, invocare una skill, piazzare un ordine? È una domanda completamente diversa.&lt;&#x2F;p&gt;
&lt;p&gt;Per un blog come questo, la risposta è: non c&#x27;è nulla da fare. Non ci sono azioni da compiere. Un agente può leggere dei miei progetti ma non può forkarne uno, prenotare una call o comprare qualcosa. Non è un fallimento, è semplicemente quello che è questo sito.&lt;&#x2F;p&gt;
&lt;p&gt;Il punteggio di 21&#x2F;100 non dice che il mio sito è invisibile agli agenti. Dice che il mio sito non espone nessuna superficie azionabile dalla macchina. Il che è accurato.&lt;&#x2F;p&gt;
&lt;p&gt;Quindi la vera domanda non è &quot;il tuo sito è agent ready?&quot; ma &lt;strong&gt;&quot;cosa vuoi che gli agenti facciano sul tuo sito?&quot;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Se la risposta è &quot;leggerlo e basta&quot;: ci sei già. Ogni LLM che ho testato l&#x27;ha fatto senza nessuna configurazione speciale.&lt;&#x2F;p&gt;
&lt;p&gt;Se vuoi che gli agenti interagiscano, transazionino o si integrino: sì, hai lavoro da fare. API, flussi di autenticazione, endpoint MCP, tutto lo stack.&lt;&#x2F;p&gt;
&lt;p&gt;Per la maggior parte dei blog personali e dei siti informativi, questo framework sta risolvendo un problema che non esiste ancora. Gli LLM possono leggere il tuo HTML. Lo fanno da anni.&lt;&#x2F;p&gt;
&lt;p&gt;Quello che Cloudflare sta davvero misurando è qualcosa di più vicino alla &lt;strong&gt;maturità API per sistemi autonomi&lt;&#x2F;strong&gt;: una preoccupazione legittima per e-commerce, piattaforme SaaS, API di servizio. Per un blog? È un martello in cerca di un chiodo.&lt;&#x2F;p&gt;
&lt;p&gt;21&#x2F;100. Ci sto benissimo.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="it">
        <title>Ho attaccato un ModernBERT con un algoritmo genetico. Ha funzionato.</title>
        <published>2026-04-27T00:00:00+00:00</published>
        <updated>2026-04-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/adversarial-nlp-genetic-algorithm/"/>
        <id>https://kalizi.dev/it/blog/adversarial-nlp-genetic-algorithm/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/adversarial-nlp-genetic-algorithm/">&lt;p&gt;Ogni hacker, a un certo livello, è qualcuno che ha deciso di non fidarsi della parola &quot;sicuro&quot;.&lt;&#x2F;p&gt;
&lt;p&gt;Kevin Mitnick è entrato nei sistemi dell&#x27;FBI mentre lo stavano cercando, e ha lasciato un pacco sul posto con scritto &quot;FBI Donuts.&quot; Frank Abagnale ha ingannato il sistema di verifica identità di un&#x27;intera compagnia aerea a 16 anni. Ogni sistema ha punti ciechi. Ed è lì che vivono gli avversari.&lt;&#x2F;p&gt;
&lt;p&gt;Per la mia tesi magistrale all&#x27;Università di Palermo, ho deciso di fare l&#x27;avversario. Non contro un istituto finanziario o una rete governativa. Contro un modello NLP allo stato dell&#x27;arte: un ModernBERT fine-tuned sul dataset di recensioni IMDB.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Il risultato: 100% di successo nell&#x27;attacco. Una media di 18 query al modello. Zero degradazione semantica.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Ecco come funziona.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;la-crepa-nel-nlp-robusto&quot;&gt;La crepa nel NLP &quot;robusto&quot;&lt;&#x2F;h2&gt;
&lt;p&gt;I modelli linguistici moderni sono davvero impressionanti. ModernBERT raggiunge il 93,9% di accuratezza nella classificazione del sentiment su IMDB dopo un fine-tuning di 3 epoche. Sembra robusto. Non lo è.&lt;&#x2F;p&gt;
&lt;p&gt;C&#x27;è una vulnerabilità strutturale che la ricerca sull&#x27;adversarial ML sfrutta da anni: &lt;strong&gt;i modelli imparano pattern dai dati di training, non il significato&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Un&#x27;illustrazione semplice. Prendi un testo di 10 parole dove ogni parola ha almeno 2 sinonimi. I sinonimi sono semanticamente equivalenti. Puoi sostituirli liberamente senza cambiare il significato della frase. Ottieni 3^10 - 1 = 59.048 versioni semanticamente equivalenti del testo originale. Il modello è stato addestrato su un corpus enorme. Quasi certamente non su tutte le 59.048 varianti.&lt;&#x2F;p&gt;
&lt;p&gt;Alcune parole sono abbastanza frequenti da essere ben rappresentate. I loro sinonimi potrebbero non esserlo. Una parola e il suo sinonimo possono finire in regioni completamente diverse della rappresentazione interna del modello. Anche se significano la stessa cosa.&lt;&#x2F;p&gt;
&lt;p&gt;Questo è il problema centrale: &lt;strong&gt;l&#x27;equivalenza semantica non garantisce l&#x27;equivalenza del classificatore&lt;&#x2F;strong&gt;. La domanda è come trovare la sostituzione giusta in modo efficiente, automatico, e senza trasformare il testo in qualcosa che nessuno scriverebbe mai.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;l-evoluzione-come-strategia-d-attacco&quot;&gt;L&#x27;evoluzione come strategia d&#x27;attacco&lt;&#x2F;h2&gt;
&lt;p&gt;È qui che entrano in gioco gli algoritmi genetici.&lt;&#x2F;p&gt;
&lt;p&gt;Gli algoritmi genetici sono metodi di ricerca ispirati all&#x27;evoluzione biologica. Si mantiene una &lt;strong&gt;popolazione&lt;&#x2F;strong&gt; di soluzioni candidate (chiamate cromosomi), ognuna valutata rispetto a una &lt;strong&gt;fitness function&lt;&#x2F;strong&gt;, e si itera attraverso due operazioni:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mutazione&lt;&#x2F;strong&gt;: piccole modifiche casuali a un candidato&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Crossover&lt;&#x2F;strong&gt;: combinazione delle caratteristiche di due candidati genitori&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Nel corso delle generazioni, la popolazione converge verso soluzioni migliori. In questo caso, testi che preservano il significato ma invertono la classificazione del modello da positivo a negativo (o viceversa).&lt;&#x2F;p&gt;
&lt;p&gt;Il nucleo della mia implementazione opera sui &lt;strong&gt;bigrammi&lt;&#x2F;strong&gt;: coppie di parole adiacenti, non token individuali. È una scelta deliberata. I bigrammi esplorano lo spazio di ricerca più velocemente delle sostituzioni a singolo token e riflettono meglio come cambia realmente il linguaggio: il contesto muta per blocchi, non in parole isolate.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;il-vincolo-difficile-l-onesta-semantica&quot;&gt;Il vincolo difficile: l&#x27;onestà semantica&lt;&#x2F;h2&gt;
&lt;p&gt;Qualsiasi esempio avversario che cambia il significato del testo originale non sta dimostrando una vulnerabilità del modello. Sta solo generando rumore. L&#x27;attacco ha senso solo se la perturbazione è genuinamente semanticamente equivalente.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Vocabolario bloccato.&lt;&#x2F;strong&gt; Non tutto è eleggibile per la sostituzione. Nomi propri, numeri, punteggiatura e token non riconosciuti sono bloccati. L&#x27;attacco opera solo sulle parole di contenuto che possono essere sostituite senza alterare il significato del testo.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Coerenza sintattica e morfologica.&lt;&#x2F;strong&gt; Ogni sostituzione candidata passa attraverso il POS-tagging via spaCy. Se la parola originale è un sostantivo plurale, anche la sostituzione deve esserlo. Se è un verbo alla terza persona singolare del presente, il sinonimo viene flesso di conseguenza, usando pyinflect sopra l&#x27;analisi morfologica di spaCy. È qui che gli approcci naïf alla sostituzione di sinonimi collassano: ignorano che &quot;gioca&quot; e &quot;giocano&quot; sono sintatticamente distinti anche se sono la stessa parola.&lt;&#x2F;p&gt;
&lt;p&gt;I sinonimi provengono da &lt;strong&gt;WordNet&lt;&#x2F;strong&gt;: non solo una lista, ma un grafo di relazioni semantiche con archi tipizzati (iperonimia, iponimia, antonimia, implicazione). Conta perché la prossimità nello spazio degli embedding non significa similarità semantica. Word2Vec è famoso per mettere i contrari vicini tra loro. WordNet non ha questo problema.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Verifica della similarità semantica.&lt;&#x2F;strong&gt; Dopo ogni mutazione, un modello &lt;code&gt;paraphrase-MiniLM-L6-v2&lt;&#x2F;code&gt; misura la similarità coseno tra il testo originale e quello perturbato. Scendi sotto la soglia configurata: perturbazione rifiutata. Questo cattura la deriva sottile che si accumula quando si sostituiscono più parole. Sinonimi individualmente validi possono combinarsi in qualcosa di semanticamente sbagliato. Il modello è stato addestrato specificamente su coppie di parafrasi, il che lo rende particolarmente adatto a questo compito.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Targeting gerarchico delle frasi.&lt;&#x2F;strong&gt; Per gli input multi-frase, l&#x27;attacco non sparge modifiche sull&#x27;intero documento. Valuta ogni frase per il suo contributo individuale alla probabilità di classificazione, poi concentra le mutazioni prima sulla frase più impattante. Questo è centrale per i numeri di efficienza.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;i-risultati&quot;&gt;I risultati&lt;&#x2F;h2&gt;
&lt;p&gt;Ho confrontato i risultati con 9 metodi allo stato dell&#x27;arte del framework TextAttack: BAE, Checklist, DeepWordBug, Faster Alzantot, Input Reduction, Pruthi, PWWS, TextBugger e TextFooler.&lt;&#x2F;p&gt;
&lt;p&gt;Il &lt;strong&gt;Global Score&lt;&#x2F;strong&gt; composito pondera il tasso di successo dell&#x27;attacco (40%), l&#x27;efficienza delle query (20%) e la preservazione semantica (40%).&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Attacco&lt;&#x2F;th&gt;&lt;th&gt;Global Score&lt;&#x2F;th&gt;&lt;th&gt;Tasso di successo&lt;&#x2F;th&gt;&lt;th&gt;Query medie&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;custom (questo lavoro)&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;97,2&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;100%&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;17,9&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Pruthi&lt;&#x2F;td&gt;&lt;td&gt;89,8&lt;&#x2F;td&gt;&lt;td&gt;89,4%&lt;&#x2F;td&gt;&lt;td&gt;3.242&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Checklist&lt;&#x2F;td&gt;&lt;td&gt;86,9&lt;&#x2F;td&gt;&lt;td&gt;93,8%&lt;&#x2F;td&gt;&lt;td&gt;260&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;BAE&lt;&#x2F;td&gt;&lt;td&gt;66,2&lt;&#x2F;td&gt;&lt;td&gt;-&lt;&#x2F;td&gt;&lt;td&gt;324&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Faster Alzantot&lt;&#x2F;td&gt;&lt;td&gt;-&lt;&#x2F;td&gt;&lt;td&gt;-&lt;&#x2F;td&gt;&lt;td&gt;10.677&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;Il divario di efficienza è il numero che conta di più. Faster Alzantot è anch&#x27;esso un algoritmo genetico. Ha bisogno di 10.677 query in media. Questa implementazione ne ha bisogno di 18. La differenza viene da tre cose: selezione gerarchica delle frasi, campionamento casuale dei bigrammi invece di valutare ogni candidato, e stop anticipato nel momento in cui l&#x27;etichetta cambia.&lt;&#x2F;p&gt;
&lt;p&gt;Il 100% di successo contro un modello con il 93,9% di accuratezza è significativo. La maggior parte degli attacchi pre-ModernBERT mostrava già alti tassi di fallimento contro di esso. La finestra di contesto più ampia di ModernBERT (8.192 token contro i 512 di BERT) e l&#x27;architettura migliorata hanno genuinamente aumentato la robustezza. Ha retto contro la maggior parte della competizione. Non ha retto contro questo.&lt;&#x2F;p&gt;
&lt;p&gt;Tutto gira su hardware consumer: Ryzen 9 5900x, RTX 3080, 128 GB di RAM. Nessun datacenter, nessun credito API, nessun accesso speciale.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cosa-rivela-davvero&quot;&gt;Cosa rivela davvero&lt;&#x2F;h2&gt;
&lt;p&gt;La lettura ovvia: anche i modelli allo stato dell&#x27;arte hanno punti ciechi sfruttabili. È vero, e non è banale.&lt;&#x2F;p&gt;
&lt;p&gt;La lettura più profonda: quando un testo e la sua versione avversaria semanticamente equivalente ricevono classificazioni diverse, il modello sta rispondendo alle distribuzioni superficiali di parole apprese dai dati di training. Non al significato. Il contenuto semantico è lo stesso. La predizione non lo è.&lt;&#x2F;p&gt;
&lt;p&gt;Questa è una proprietà strutturale, non un bug. E ha conseguenze dirette per qualsiasi deployment NLP in produzione dove un avversario ha un incentivo a invertire una classificazione:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Monitoraggio del sentiment per intelligence di mercato o politica&lt;&#x2F;li&gt;
&lt;li&gt;Sistemi di moderazione dei contenuti&lt;&#x2F;li&gt;
&lt;li&gt;Classificazione di testi medici o legali&lt;&#x2F;li&gt;
&lt;li&gt;Sistemi di raccomandazione che si affidano a valutazioni automatiche della qualità del testo&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;L&#x27;attacco funziona in &lt;strong&gt;modalità black-box&lt;&#x2F;strong&gt;: nessun accesso ai pesi, nessun gradiente, solo accesso alle query. Un endpoint API è sufficiente. L&#x27;avversario non ha bisogno di sapere nulla degli interni del modello.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;problemi-aperti&quot;&gt;Problemi aperti&lt;&#x2F;h2&gt;
&lt;p&gt;Due direzioni che vale la pena esplorare.&lt;&#x2F;p&gt;
&lt;p&gt;Prima i domini ristretti. Un modello addestrato esclusivamente su testi legali o medici è probabilmente più fragile, non meno. Il vocabolario è più piccolo, i pattern più prevedibili, lo spazio di ricerca adversarial più vincolato. L&#x27;attacco richiederebbe probabilmente ancora meno query.&lt;&#x2F;p&gt;
&lt;p&gt;Gli LLM sono il problema più difficile. La letteratura sull&#x27;adversarial ML si concentra sempre di più lì: jailbreak, prompt injection, agenti dormienti che si attivano solo sotto condizioni trigger specifiche. L&#x27;approccio di ricerca evolutiva si generalizza in linea di principio. La sfida pratica è il costo delle query e la natura stocastica dell&#x27;output degli LLM, che rende la valutazione della fitness incoerente. Vale la pena esplorarlo.&lt;&#x2F;p&gt;
&lt;p&gt;Le difese sono la questione aperta. La risposta ovvia è l&#x27;adversarial training: includere esempi avversariali nel training set. Ma l&#x27;adversarial training su un metodo di attacco non si generalizza bene ad altri, e l&#x27;attacco evolve. La corsa agli armamenti è in corso.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;Bruce Schneier l&#x27;ha detto bene: &lt;em&gt;&quot;Se pensi che la tecnologia possa risolvere i tuoi problemi di sicurezza, non capisci né i problemi né la tecnologia.&quot;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Un modello con il 93,9% di accuratezza è genuinamente buono. È anche un sistema con vulnerabilità strutturali che possono essere localizzate e sfruttate senza alcun accesso agli interni. Capire quelle vulnerabilità è il prerequisito per costruire sistemi davvero affidabili. Non solo accurati sul test set.&lt;&#x2F;p&gt;
&lt;p&gt;L&#x27;avversario sa sempre esattamente dove guardare. Costruire la difesa richiede prima capire l&#x27;attacco.&lt;&#x2F;p&gt;
&lt;p&gt;Ho costruito l&#x27;attacco. La difesa è il problema aperto.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;La tesi completa è disponibile su richiesta. L&#x27;implementazione gira su Python 3.9-3.11, costruita su spaCy, WordNet (via NLTK), HuggingFace Transformers, BitsAndBytes e pyinflect.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="it">
        <title>Blocca le dipendenze con Docker: come ha salvato la build Android di un vecchio progetto React Native</title>
        <published>2023-01-15T00:00:00+00:00</published>
        <updated>2023-01-15T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/docker-react-native-build/"/>
        <id>https://kalizi.dev/it/blog/docker-react-native-build/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/docker-react-native-build/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Sviluppo di pacchetti Laravel Parte 2: Controller, Request e TDD</title>
        <published>2022-09-01T00:00:00+00:00</published>
        <updated>2022-09-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/laravel-package-development-2/"/>
        <id>https://kalizi.dev/it/blog/laravel-package-development-2/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/laravel-package-development-2/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Sviluppo di pacchetti Laravel Parte 1: progettare un pacchetto per la registrazione delle sessioni utente</title>
        <published>2022-08-01T00:00:00+00:00</published>
        <updated>2022-08-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/laravel-package-development-1/"/>
        <id>https://kalizi.dev/it/blog/laravel-package-development-1/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/laravel-package-development-1/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Strategie Data-Driven con Laravel #5: email tracking, hanno letto le tue email?</title>
        <published>2022-07-01T00:00:00+00:00</published>
        <updated>2022-07-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/laravel-email-tracking/"/>
        <id>https://kalizi.dev/it/blog/laravel-email-tracking/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/laravel-email-tracking/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Strategie Data-Driven con Laravel #4: tracciamento della navigazione utente e funnel</title>
        <published>2022-06-01T00:00:00+00:00</published>
        <updated>2022-06-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/laravel-funnel-tracking/"/>
        <id>https://kalizi.dev/it/blog/laravel-funnel-tracking/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/laravel-funnel-tracking/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Strategie Data-Driven con Laravel #3: migliora la UX con heat map e click map</title>
        <published>2022-05-01T00:00:00+00:00</published>
        <updated>2022-05-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/laravel-heat-maps/"/>
        <id>https://kalizi.dev/it/blog/laravel-heat-maps/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/laravel-heat-maps/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Strategie Data-Driven con Laravel #2: configura la registrazione delle sessioni utente</title>
        <published>2022-04-01T00:00:00+00:00</published>
        <updated>2022-04-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/laravel-session-recording/"/>
        <id>https://kalizi.dev/it/blog/laravel-session-recording/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/laravel-session-recording/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Strategie Data-Driven con Laravel #1: configura l&#x27;A&#x2F;B testing nella tua applicazione</title>
        <published>2022-03-01T00:00:00+00:00</published>
        <updated>2022-03-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/laravel-ab-testing/"/>
        <id>https://kalizi.dev/it/blog/laravel-ab-testing/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/laravel-ab-testing/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Difendersi dagli attacchi Ransomware</title>
        <published>2021-09-01T00:00:00+00:00</published>
        <updated>2021-09-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/defending-ransomware/"/>
        <id>https://kalizi.dev/it/blog/defending-ransomware/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/defending-ransomware/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Sicurezza 101 per Java: CWE-22 Path Traversal</title>
        <published>2021-08-01T00:00:00+00:00</published>
        <updated>2021-08-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/java-security-cwe22-path-traversal/"/>
        <id>https://kalizi.dev/it/blog/java-security-cwe22-path-traversal/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/java-security-cwe22-path-traversal/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Combinare debugging in produzione e remoto nelle applicazioni Java</title>
        <published>2021-07-01T00:00:00+00:00</published>
        <updated>2021-07-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/java-remote-debugging/"/>
        <id>https://kalizi.dev/it/blog/java-remote-debugging/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/java-remote-debugging/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Sto imparando l&#x27;Ethical Hacking: ecco come sono passato da 0 a 1</title>
        <published>2021-06-10T00:00:00+00:00</published>
        <updated>2021-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/ethical-hacking-0-to-1/"/>
        <id>https://kalizi.dev/it/blog/ethical-hacking-0-to-1/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/ethical-hacking-0-to-1/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Vulnerabilità open source nello sviluppo web</title>
        <published>2021-05-01T00:00:00+00:00</published>
        <updated>2021-05-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/open-source-vulnerabilities-web/"/>
        <id>https://kalizi.dev/it/blog/open-source-vulnerabilities-web/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/open-source-vulnerabilities-web/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Le migliori soluzioni di hosting WordPress per la sicurezza nel 2021</title>
        <published>2021-04-01T00:00:00+00:00</published>
        <updated>2021-04-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/wordpress-hosting-security-2021/"/>
        <id>https://kalizi.dev/it/blog/wordpress-hosting-security-2021/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/wordpress-hosting-security-2021/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Come iniziare lo sviluppo di plugin WordPress con Docker: Parte 2, creare una pagina semplice</title>
        <published>2021-03-01T00:00:00+00:00</published>
        <updated>2021-03-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/wordpress-plugin-docker-2/"/>
        <id>https://kalizi.dev/it/blog/wordpress-plugin-docker-2/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/wordpress-plugin-docker-2/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Come iniziare lo sviluppo di plugin WordPress con Docker: Parte 1, Docker e pannello Admin</title>
        <published>2021-02-01T00:00:00+00:00</published>
        <updated>2021-02-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/wordpress-plugin-docker-1/"/>
        <id>https://kalizi.dev/it/blog/wordpress-plugin-docker-1/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/wordpress-plugin-docker-1/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Gatsby.js, GitHub e Cloudflare: costruisci un sito statico con React</title>
        <published>2020-09-01T00:00:00+00:00</published>
        <updated>2020-09-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/gatsby-github-cloudflare-static-site/"/>
        <id>https://kalizi.dev/it/blog/gatsby-github-cloudflare-static-site/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/gatsby-github-cloudflare-static-site/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Machine Learning con PHP usando Support Vector Machine (SVM) tramite ext-svm</title>
        <published>2020-06-01T00:00:00+00:00</published>
        <updated>2020-06-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/machine-learning-php-svm/"/>
        <id>https://kalizi.dev/it/blog/machine-learning-php-svm/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/machine-learning-php-svm/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Configura una Dashboard Admin Laravel con InfyOm in pochi minuti, anche su progetti esistenti</title>
        <published>2020-03-01T00:00:00+00:00</published>
        <updated>2020-03-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/laravel-admin-dashboard-infyom/"/>
        <id>https://kalizi.dev/it/blog/laravel-admin-dashboard-infyom/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/laravel-admin-dashboard-infyom/"></content>
        
    </entry>
    <entry xml:lang="it">
        <title>Implementa l&#x27;autenticazione JWT tra più API con Laravel</title>
        <published>2020-01-01T00:00:00+00:00</published>
        <updated>2020-01-01T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              Andrea Bondì
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://kalizi.dev/it/blog/laravel-jwt-authentication/"/>
        <id>https://kalizi.dev/it/blog/laravel-jwt-authentication/</id>
        
        <content type="html" xml:base="https://kalizi.dev/it/blog/laravel-jwt-authentication/"></content>
        
    </entry>
</feed>
