<?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: frontendfacile.it</title>
    <description>The latest articles on DEV Community by frontendfacile.it (@frontendfacile).</description>
    <link>https://dev.to/frontendfacile</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3986194%2Fffc84293-7385-4ecc-912c-3e88951b5cb3.png</url>
      <title>DEV Community: frontendfacile.it</title>
      <link>https://dev.to/frontendfacile</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frontendfacile"/>
    <language>en</language>
    <item>
      <title>TimescaleDB: quando PostgreSQL incontra le serie temporali (senza smettere di essere PostgreSQL)</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Thu, 24 Sep 2026 11:19:59 +0000</pubDate>
      <link>https://dev.to/frontendfacile/timescaledb-quando-postgresql-incontra-le-serie-temporali-senza-smettere-di-essere-postgresql-2kl6</link>
      <guid>https://dev.to/frontendfacile/timescaledb-quando-postgresql-incontra-le-serie-temporali-senza-smettere-di-essere-postgresql-2kl6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Aggregazioni pre-calcolate, gestione automatica dei chunk e query di dashboard che restano veloci anche con milioni di eventi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Il problema reale: la dashboard non dovrebbe ricalcolare sempre tutto
&lt;/h2&gt;

&lt;p&gt;Immagina due database sullo stesso laptop, entrambi con &lt;strong&gt;10 milioni di record di richieste HTTP&lt;/strong&gt;. La domanda è la stessa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;quante richieste arrivano &lt;strong&gt;ogni ora&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;qual è la loro &lt;strong&gt;latenza media&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nel primo caso PostgreSQL calcola la risposta leggendo (e raggruppando) &lt;strong&gt;gli eventi grezzi&lt;/strong&gt;. Nel secondo caso si legge invece un &lt;strong&gt;riepilogo orario&lt;/strong&gt; già pronto.&lt;/p&gt;

&lt;p&gt;Risultato tipico:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;query sugli eventi: ~&lt;strong&gt;1,6 secondi&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;query sul riepilogo: ~&lt;strong&gt;10 millisecondi&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le risposte coincidono. A cambiare è &lt;em&gt;la quantità di lavoro&lt;/em&gt;: o fai aggregazione “live” su milioni di righe, oppure leggi risultati già aggregati.&lt;/p&gt;

&lt;p&gt;A questo punto viene spontaneo dire: “Ok, allora basta salvare i riepiloghi anche in PostgreSQL”. Vero. Il punto è un altro: &lt;strong&gt;mantenerli aggiornati in modo affidabile e incrementale&lt;/strong&gt;, senza dover ricalcolare l’intera storia ogni volta che arrivano nuovi dati.&lt;/p&gt;

&lt;p&gt;È qui che entrano in gioco le &lt;strong&gt;continuous aggregates&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Che cos’è TimescaleDB (in pratica)
&lt;/h2&gt;

&lt;p&gt;La cosa più importante da chiarire subito: &lt;strong&gt;TimescaleDB è PostgreSQL&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Non è un fork, non è un database “a parte”, non ti costringe a un linguaggio proprietario. È un’&lt;strong&gt;estensione&lt;/strong&gt;, esattamente come accade con PostGIS (geospaziale) o pgvector (embedding).&lt;/p&gt;

&lt;p&gt;Conseguenze pratiche molto concrete:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;continui a usare &lt;strong&gt;SQL&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;continui a usare i tuoi strumenti: migration framework (Django/Rails/Prisma), pooler, &lt;code&gt;pg_dump&lt;/code&gt;, monitoraggio&lt;/li&gt;
&lt;li&gt;l’installazione a livello database è banale: &lt;code&gt;CREATE EXTENSION ...&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un dettaglio operativo spesso sottovalutato: l’estensione va abilitata &lt;strong&gt;per database&lt;/strong&gt;. Se crei un nuovo database, devi eseguire di nuovo &lt;code&gt;CREATE EXTENSION&lt;/code&gt; lì.&lt;/p&gt;




&lt;h2&gt;
  
  
  Perché le serie temporali stressano Postgres (anche quando Postgres è “abbastanza”)
&lt;/h2&gt;

&lt;p&gt;I workload time-series hanno alcuni tratti ricorrenti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;i record &lt;strong&gt;arrivano continuamente&lt;/strong&gt; (append-heavy)&lt;/li&gt;
&lt;li&gt;la maggior parte dei dati storici &lt;strong&gt;non cambia&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;le query filtrano quasi sempre un &lt;strong&gt;intervallo di tempo&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;dashboard e report fanno spesso &lt;strong&gt;le stesse aggregazioni&lt;/strong&gt; su finestre temporali simili&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esempi classici: richieste HTTP, prezzi finanziari, sensori IoT, log applicativi, metriche di pipeline/AI agent, ecc.&lt;/p&gt;

&lt;p&gt;PostgreSQL gestisce dataset grandi, ma con una &lt;em&gt;event table&lt;/em&gt; che cresce senza sosta emergono costi sempre più visibili:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;indici “attivi” molto grandi → più I/O e più manutenzione&lt;/li&gt;
&lt;li&gt;cancellare dati vecchi → lavoro di cleanup (vacuum, bloat, ecc.)&lt;/li&gt;
&lt;li&gt;dashboard che “scansiona la storia” → ricalcoli ripetuti e costosi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Postgres offre già strumenti (ad esempio partitioning), ma TimescaleDB aggiunge tre leve pensate specificamente per questo scenario:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;gestione automatica dei chunk&lt;/strong&gt; (partizionamento time-oriented gestito dal motore)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;storage colonnare / compressione&lt;/strong&gt; (in base alla configurazione)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;continuous aggregates&lt;/strong&gt; (aggregazioni incrementali mantenute nel tempo)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;L’idea non è “magia”: è &lt;strong&gt;ingegnerizzare i pattern più comuni&lt;/strong&gt; delle serie temporali in modo robusto e ripetibile.&lt;/p&gt;




&lt;h2&gt;
  
  
  Continuous aggregates: la differenza tra “calcolare” e “leggere”
&lt;/h2&gt;

&lt;p&gt;La logica è semplice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;se la tua dashboard chiede “per ora” o “per giorno”, probabilmente non vuoi raggruppare ogni volta la tabella eventi&lt;/li&gt;
&lt;li&gt;vuoi una vista/materializzazione che contenga già: conteggi, medie, min/max, ecc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il tema però è la manutenzione:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;il primo calcolo “storico” può richiedere tempo (ed è normale)&lt;/li&gt;
&lt;li&gt;poi serve un meccanismo affidabile per &lt;strong&gt;refresh incrementali&lt;/strong&gt; man mano che arrivano nuovi record (e, in alcuni casi, quando cambi regole o dati)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TimescaleDB rende questo aggiornamento &lt;em&gt;time-aware&lt;/em&gt;: l’obiettivo è evitare di “rifare tutto da zero” quando ti basta aggiornare solo l’ultima finestra temporale.&lt;/p&gt;

&lt;p&gt;Risultato: query di dashboard che restano &lt;strong&gt;reattive&lt;/strong&gt; anche quando la tabella eventi cresce in modo aggressivo.&lt;/p&gt;

&lt;p&gt;Nota importante: i numeri (1,6s vs 10ms) dipendono da schema, hardware, distribuzione dei dati, filtri, ecc. Quello che conta è il meccanismo: &lt;strong&gt;meno lavoro a query-time&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Il dataset “tipo”: una riga per richiesta HTTP
&lt;/h2&gt;

&lt;p&gt;Uno scenario estremamente comune per ragionare su time-series è una tabella che rappresenta un access log “strutturato”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;time&lt;/strong&gt;: timestamp dell’evento (la colonna più importante)&lt;/li&gt;
&lt;li&gt;campi “chi/cosa”: server, dominio, sessione, URL&lt;/li&gt;
&lt;li&gt;esito: status code&lt;/li&gt;
&lt;li&gt;performance: durata (latenza)&lt;/li&gt;
&lt;li&gt;contesto: geografia, user agent, bytes, ecc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La chiave: &lt;strong&gt;una riga per evento&lt;/strong&gt;, potenzialmente milioni o miliardi.&lt;/p&gt;

&lt;p&gt;Tutto quello che farai in analisi parte quasi sempre da:&lt;/p&gt;

&lt;p&gt;1) filtrare un intervallo temporale&lt;br&gt;
2) raggruppare&lt;br&gt;
3) calcolare aggregati&lt;/p&gt;




&lt;h2&gt;
  
  
  Il “20% di SQL” che copre l’80% dell’analisi time-series
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Date arithmetic con &lt;code&gt;interval&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Filtrare “ultime 24 ore”, “ultimi 7 giorni”, “ultimi 15 minuti” dovrebbe essere naturale. In PostgreSQL lo è:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;timestamp - interval '24 hours'&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;timestamp - interval '7 days'&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sono valori tipizzati, non stringhe “finte”. È un dettaglio che fa la differenza nella qualità delle query e nella leggibilità.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) &lt;code&gt;GROUP BY&lt;/code&gt; per impilare eventi in “pile”
&lt;/h3&gt;

&lt;p&gt;Il salto mentale utile: gli aggregati non si calcolano “per riga”, ma &lt;strong&gt;per gruppo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Esempio tipico: raggruppare per &lt;code&gt;status&lt;/code&gt; per capire quante 200/404/500 hai visto e con quale latenza media.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Aggregazioni condizionali con &lt;code&gt;FILTER&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Quando vuoi più contatori in &lt;strong&gt;una sola passata&lt;/strong&gt; sui dati (totale, errori 5xx, not found 404, ecc.), &lt;code&gt;FILTER&lt;/code&gt; è spesso più leggibile (e in genere più efficiente) rispetto a &lt;code&gt;CASE WHEN ...&lt;/code&gt; ripetuti.&lt;/p&gt;

&lt;p&gt;È anche il modo più pulito per derivare metriche come &lt;strong&gt;error rate&lt;/strong&gt; senza lanciare query multiple.&lt;/p&gt;

&lt;h3&gt;
  
  
  4) Percentili: utilissimi, ma costosi se “esatti”
&lt;/h3&gt;

&lt;p&gt;La latenza media spesso racconta una storia rassicurante. Il P95/P99 racconta quella vera per gli utenti peggiori.&lt;/p&gt;

&lt;p&gt;In PostgreSQL, i percentili esatti richiedono ordinamento dei valori (&lt;code&gt;ORDER BY&lt;/code&gt; all’interno dell’aggregazione). Su poche migliaia di righe è ok; su decine/centinaia di milioni può diventare un problema serio.&lt;/p&gt;

&lt;p&gt;Qui la lezione pratica è: &lt;strong&gt;misura e valuta alternative approssimate&lt;/strong&gt; quando la scala cresce.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tipi dati che contano davvero in questi schemi
&lt;/h2&gt;

&lt;p&gt;Tre scelte ricorrenti fanno la differenza nel tempo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;timestamptz&lt;/code&gt;&lt;/strong&gt;: preferiscilo sempre a &lt;code&gt;timestamp&lt;/code&gt; “senza time zone”. &lt;code&gt;timestamptz&lt;/code&gt; rappresenta un momento assoluto e si adatta al fuso del client in output. &lt;code&gt;timestamp&lt;/code&gt; invece è un orario “da parete”, ambiguo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;jsonb&lt;/code&gt;&lt;/strong&gt;: perfetto per attributi rari/long-tail che non meritano una colonna dedicata, con possibilità di indicizzazione.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;uuid&lt;/code&gt;&lt;/strong&gt;: utile per identificatori robusti e distribuiti, ma ha implicazioni interessanti su indici e locality (tema che in dataset grandi emerge presto).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  La skill che sblocca tutto: leggere &lt;code&gt;EXPLAIN&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Se devi portarti a casa una sola competenza “operativa” quando lavori su performance, è questa.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;EXPLAIN&lt;/code&gt; mostra il &lt;strong&gt;piano previsto&lt;/strong&gt; (senza eseguire)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt; esegue e mostra cosa è successo davvero&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EXPLAIN ANALYZE BUFFERS&lt;/code&gt; aggiunge &lt;em&gt;quanta memoria/pagine&lt;/em&gt; sono state toccate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quest’ultimo è sottoutilizzato, ma spesso è quello che ti dice la verità: non solo “quanto ci ha messo”, ma &lt;strong&gt;quanta roba ha dovuto leggere&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E soprattutto ti aiuta a distinguere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;sequential scan&lt;/strong&gt;: legge molte righe per trovare quelle utili&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;index scan&lt;/strong&gt;: salta più direttamente alle righe rilevanti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nelle serie temporali, dove quasi tutto è filtrato per tempo, capire &lt;em&gt;quando&lt;/em&gt; stai ancora scansionando troppo (e perché) è metà del lavoro.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sintesi: cosa cambia davvero con TimescaleDB
&lt;/h2&gt;

&lt;p&gt;Per dati time-series, il punto non è “Postgres è lento”. Il punto è che certi pattern diventano inevitabilmente costosi quando:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;la tabella eventi cresce continuamente&lt;/li&gt;
&lt;li&gt;le dashboard ricalcolano sempre gli stessi aggregati&lt;/li&gt;
&lt;li&gt;retention e manutenzione iniziano a pesare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TimescaleDB resta dentro Postgres (stesso SQL, stessi strumenti), ma aggiunge primitive mirate: &lt;strong&gt;chunk management&lt;/strong&gt;, &lt;strong&gt;ottimizzazioni di storage&lt;/strong&gt;, e soprattutto &lt;strong&gt;continuous aggregates&lt;/strong&gt; per trasformare query di dashboard da “calcola su milioni di righe” a “leggi un riepilogo mantenuto aggiornato”.&lt;/p&gt;

&lt;p&gt;L’implicazione pratica è chiara: se stai costruendo osservabilità, telemetria, metriche di prodotto o qualsiasi sistema che vive di grafici per intervalli temporali, vale la pena progettare da subito pensando a &lt;strong&gt;pre-aggregazione time-aware&lt;/strong&gt; e a un workflow di misurazione basato su &lt;code&gt;EXPLAIN (ANALYZE, BUFFERS)&lt;/code&gt;—prima ancora di inseguire micro-ottimizzazioni o indici “a tentoni”.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/timescaledb-quando-postgresql-incontra-le-serie-temporali-senza-smettere-di-esse" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/timescaledb-quando-postgresql-incontra-le-serie-temporali-senza-smettere-di-esse&lt;/a&gt;&lt;/p&gt;

</description>
      <category>timescaledb</category>
      <category>serietemporali</category>
      <category>continuousaggregates</category>
      <category>explainanalyze</category>
    </item>
    <item>
      <title>Dal codice scritto dagli agenti alla produzione in pochi minuti: un workflow moderno con Vercel</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Thu, 24 Sep 2026 11:14:59 +0000</pubDate>
      <link>https://dev.to/frontendfacile/dal-codice-scritto-dagli-agenti-alla-produzione-in-pochi-minuti-un-workflow-moderno-con-vercel-4b74</link>
      <guid>https://dev.to/frontendfacile/dal-codice-scritto-dagli-agenti-alla-produzione-in-pochi-minuti-un-workflow-moderno-con-vercel-4b74</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Branch deploy, AI SDK e un approccio “agent-first” per ridurre il tempo tra idea, prototipo e impatto reale.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;L’adozione di &lt;strong&gt;coding agents&lt;/strong&gt; sta cambiando la geografia del lavoro frontend (e non solo). Quando la capacità di generare codice aumenta di un ordine di grandezza, il vero rischio è spostare il collo di bottiglia altrove: review infinite, ambienti di test incoerenti, deploy lenti, prototipi che non arrivano mai nelle mani giuste.&lt;/p&gt;

&lt;p&gt;In uno scenario “agent-first”, la domanda pratica diventa: &lt;strong&gt;come porto in produzione (o almeno in preview) il codice prodotto dagli agenti in minuti, mantenendo controllo e qualità?&lt;/strong&gt; La risposta, sempre più spesso, è un workflow costruito attorno a &lt;strong&gt;deploy effimeri&lt;/strong&gt;, branch preview e automazioni che rendono il ciclo “idea → verifica → rilascio” il più corto possibile.&lt;/p&gt;

&lt;h2&gt;
  
  
  L’obiettivo: ingegneri con più agency, non solo più codice
&lt;/h2&gt;

&lt;p&gt;Quando hai agenti che sfornano feature, refactor e fix, non ti serve soltanto velocità di output. Ti serve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agency&lt;/strong&gt;: ogni ingegnere deve poter spingere un’iniziativa fino all’impatto, senza dipendere da mille passaggi intermedi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Affidabilità&lt;/strong&gt;: l’aumento della velocità non deve tradursi in instabilità.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consegna rapida&lt;/strong&gt;: il deploy deve essere parte del flusso, non un evento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questa impostazione cambia anche il modo in cui si pensano le applicazioni interne: se i team usano agenti per costruire automazioni e strumenti, serve una piattaforma che renda il &lt;em&gt;shipping&lt;/em&gt; banale e ripetibile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perché i branch deployments diventano il centro del workflow
&lt;/h2&gt;

&lt;p&gt;Il punto di svolta, per molti team, è spostare la prototipazione su &lt;strong&gt;branch deployments&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In pratica, ogni branch diventa un ambiente di esecuzione autonomo, con un URL condivisibile. Questo abilita tre cose fondamentali:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Prototipazione immediata&lt;/strong&gt;: una feature generata da un agente può essere provata subito, senza “integrazioni obbligate” nel trunk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback mirato&lt;/strong&gt;: chi deve validare (PM, designer, stakeholder interni) non legge PR, prova direttamente l’interfaccia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterazione rapida&lt;/strong&gt;: si riduce l’attrito nel passare dal “quasi pronto” al “pronto davvero”.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quando l’obiettivo è arrivare dal &lt;strong&gt;80–90%&lt;/strong&gt; al &lt;strong&gt;99–100%&lt;/strong&gt; di qualità percepita, la differenza la fa spesso la capacità di iterare su dettagli, edge case e UX: avere preview affidabili accelera proprio quel tratto finale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deploy come infrastruttura per l’adozione degli agenti
&lt;/h2&gt;

&lt;p&gt;Un punto interessante dei workflow moderni è che gli agenti non sono solo “generatori di feature”. Possono diventare anche:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;manutentori guidati&lt;/strong&gt;, che propongono fix contestuali&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;refactor assistant&lt;/strong&gt;, che migliorano leggibilità e coerenza&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;strumenti di automazione interna&lt;/strong&gt;, capaci di eliminare lavori ripetitivi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ma tutto questo vale solo se il percorso per mettere online quel codice è lineare. Se ogni deploy richiede passaggi manuali, permessi, sincronizzazioni e rituali, la produttività guadagnata con gli agenti evapora.&lt;/p&gt;

&lt;p&gt;Vercel, in questo tipo di architettura, viene spesso scelta proprio perché rende il deploy un’operazione “di default”: push → build → preview → validazione.&lt;/p&gt;

&lt;h2&gt;
  
  
  Incidenti e produzione: quando gli agenti entrano nel loop operativo
&lt;/h2&gt;

&lt;p&gt;C’è un altro fronte, meno discusso ma molto concreto: &lt;strong&gt;l’operatività&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Quando un sistema di alert segnala un problema in produzione, la parte costosa non è solo il fix, ma il &lt;strong&gt;context switching&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;capire cosa è successo&lt;/li&gt;
&lt;li&gt;raccogliere log e segnali&lt;/li&gt;
&lt;li&gt;formulare ipotesi&lt;/li&gt;
&lt;li&gt;identificare la regressione&lt;/li&gt;
&lt;li&gt;proporre remediation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qui entra in gioco un pattern emergente: usare uno &lt;strong&gt;swarm di agenti&lt;/strong&gt; per il triage e la remediation, orchestrati tramite un SDK dedicato (come il &lt;strong&gt;Vercel AI SDK&lt;/strong&gt;). L’idea è far lavorare più agenti in parallelo su:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;raccolta e sintesi dei segnali&lt;/li&gt;
&lt;li&gt;analisi della causa probabile&lt;/li&gt;
&lt;li&gt;proposta di patch o mitigazione&lt;/li&gt;
&lt;li&gt;preparazione di output utili per l’ingegnere che approva e rilascia&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il risultato atteso è una riduzione netta del &lt;strong&gt;Mean Time To Resolution (MTTR)&lt;/strong&gt;: non perché “gli agenti risolvono tutto da soli”, ma perché riducono drasticamente il tempo necessario a orientarsi e convergere su un intervento.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implicazioni pratiche per team frontend
&lt;/h2&gt;

&lt;p&gt;Se stai progettando un workflow simile, questi sono i punti che contano davvero:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Preview per ogni branch come standard&lt;/strong&gt;: deve essere immediato condividere una build funzionante.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validazione rapida del valore&lt;/strong&gt;: il deploy non serve solo a “rilasciare”, ma a capire se un’idea merita di diventare prodotto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automazioni interne come primo cittadino&lt;/strong&gt;: strumenti e micro-app interne devono poter essere create e iterate con la stessa facilità del prodotto principale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operazioni assistite&lt;/strong&gt;: integrare agenti nel flusso incidentale (triage/remediation) riduce il costo cognitivo dell’on-call.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sintesi: la velocità non è scrivere codice, è spedirlo bene
&lt;/h2&gt;

&lt;p&gt;Con i coding agents, la produzione di codice non è più la risorsa scarsa. Lo diventano &lt;strong&gt;deploy, validazione e iterazione&lt;/strong&gt;. Un setup basato su Vercel — con branch deployments e integrazione di agenti anche nei flussi operativi — sposta il focus su ciò che conta: trasformare output “quasi pronti” in soluzioni affidabili, provabili e distribuibili in tempi molto brevi.&lt;/p&gt;

&lt;p&gt;L’implicazione più interessante è organizzativa prima che tecnica: quando il deploy è semplice e la preview è immediata, ogni ingegnere può davvero lavorare con un livello di autonomia e impatto superiore, senza sacrificare controllo e qualità.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/dal-codice-scritto-dagli-agenti-alla-produzione-in-pochi-minuti-un-workflow-mode" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/dal-codice-scritto-dagli-agenti-alla-produzione-in-pochi-minuti-un-workflow-mode&lt;/a&gt;&lt;/p&gt;

</description>
      <category>branchdeployments</category>
      <category>vercelaisdk</category>
      <category>workflowagentfirst</category>
      <category>incidenttriage</category>
    </item>
    <item>
      <title>33 ore, 8 milioni e una lezione scomoda: cosa insegna il “quasi-ribaltone” in Automattic</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Thu, 24 Sep 2026 11:09:58 +0000</pubDate>
      <link>https://dev.to/frontendfacile/33-ore-8-milioni-e-una-lezione-scomoda-cosa-insegna-il-quasi-ribaltone-in-automattic-3k9j</link>
      <guid>https://dev.to/frontendfacile/33-ore-8-milioni-e-una-lezione-scomoda-cosa-insegna-il-quasi-ribaltone-in-automattic-3k9j</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Governance, controllo del voto e infrastrutture critiche: quando WordPress non è solo un CMS, ma un pezzo di economia del web.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Automattic è una di quelle aziende che, per chi lavora nel frontend, spesso resta sullo sfondo: la incontri indirettamente attraverso WordPress.com, WooCommerce, Tumblr, o più banalmente perché WordPress alimenta ancora una fetta enorme del web. Proprio per questo, quando succede qualcosa ai suoi vertici non è solo gossip da tech industry: è un segnale su come potere, governance e infrastruttura possano intrecciarsi in modi poco rassicuranti.&lt;/p&gt;

&lt;p&gt;Nelle ultime settimane l’azienda ha vissuto un episodio surreale per velocità e costo: un tentativo di sostituire il fondatore alla guida, concluso in poco più di un giorno con il ritorno del fondatore stesso e una conseguenza immediata — &lt;strong&gt;oltre 8 milioni di dollari&lt;/strong&gt; in buonuscite dovute a due dirigenti rimossi dopo appena &lt;strong&gt;33 ore&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Al di là dei dettagli, la storia è utile perché porta a galla tre temi che impattano chiunque costruisca prodotti sul web: &lt;strong&gt;(1) cosa significa davvero “il board conta più del CEO”&lt;/strong&gt;, &lt;strong&gt;(2) quanto può valere il controllo del voto&lt;/strong&gt;, &lt;strong&gt;(3) perché possedere un’infrastruttura critica cambia il peso di ogni decisione&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  1) Il board può “licenziare” un CEO… ma non sempre può cambiarne il destino
&lt;/h2&gt;

&lt;p&gt;In moltissime aziende tech la regola implicita è semplice: il &lt;strong&gt;board of directors&lt;/strong&gt; sta sopra al CEO. Se il CEO prende decisioni ritenute dannose (strategie legali aggressive, gestione reputazionale disastrosa, scelte che deprimono la valutazione), il board ha leve per intervenire.&lt;/p&gt;

&lt;p&gt;Nel caso Automattic, il board ha effettivamente provato a rimuovere il fondatore dalla carica di CEO, promuovendo il CFO al ruolo di CEO e presentando pubblicamente il passaggio come ordinato e condiviso.&lt;/p&gt;

&lt;p&gt;Fin qui, scenario “da manuale”. Il punto è che il manuale cambia completamente quando la struttura dei voti è sbilanciata.&lt;/p&gt;




&lt;h2&gt;
  
  
  2) Se controlli la maggioranza del voto, un “cambio di CEO” può durare quanto un deploy annullato
&lt;/h2&gt;

&lt;p&gt;Il dettaglio che trasforma una crisi in un boomerang è questo: il fondatore &lt;strong&gt;detiene una quota enorme del potere di voto&lt;/strong&gt; (si parla dell’&lt;strong&gt;84%&lt;/strong&gt;). In pratica, anche se il board vota la rimozione, chi controlla il voto può:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sostituire i membri del board;&lt;/li&gt;
&lt;li&gt;nominare un board allineato;&lt;/li&gt;
&lt;li&gt;farsi reintegrare rapidamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;È esattamente il tipo di architettura di governance che rende possibile un rientro “lampo”. E qui c’è una lezione che va oltre Automattic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nelle aziende con voto concentrato, gli organi di controllo possono essere reali solo finché il controllore principale lo accetta.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Per chi lavora nel prodotto, questo ha una conseguenza pratica: la &lt;strong&gt;stabilità decisionale&lt;/strong&gt; non dipende solo da processi e organigrammi, ma dalla &lt;strong&gt;distribuzione del potere contrattuale&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3) Quando in 33 ore si firmano buonuscite: gli incentivi contano più delle intenzioni
&lt;/h2&gt;

&lt;p&gt;La parte economicamente più significativa dell’episodio è anche la più istruttiva: durante la finestra in cui due dirigenti hanno gestito l’azienda, sarebbero stati preparati accordi di uscita che prevedevano condizioni estremamente favorevoli in caso di licenziamento (stipendio annuale, copertura sanitaria, vesting immediato delle azioni).&lt;/p&gt;

&lt;p&gt;Risultato: al ritorno del fondatore e al conseguente licenziamento dei due dirigenti, l’azienda si ritrova con un conto da &lt;strong&gt;oltre 8 milioni&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Non è solo una cifra impressionante: è un promemoria su come, nelle crisi, &lt;strong&gt;gli incentivi e le tutele contrattuali&lt;/strong&gt; diventino una variabile di primo livello. Quando i ruoli cambiano rapidamente, chi ha il tempo (e l’autorità temporanea) di firmare cose, spesso lo fa.&lt;/p&gt;

&lt;p&gt;Per un team tecnico questo si traduce in un punto molto concreto: nelle fasi di instabilità al vertice, &lt;strong&gt;la probabilità di decisioni irreversibili&lt;/strong&gt; (contratti, policy, licenze, accessi, deleghe) sale.&lt;/p&gt;




&lt;h2&gt;
  
  
  4) Open source, controllo operativo e “punto singolo di influenza”
&lt;/h2&gt;

&lt;p&gt;C’è poi un livello ancora più delicato: l’ecosistema WordPress non è solo un prodotto, è una rete di distribuzione.&lt;/p&gt;

&lt;p&gt;Quando parliamo di update, plugin e temi, la dipendenza non è astratta: migliaia di installazioni “tirano” componenti e aggiornamenti da snodi centrali. Se una parte di questa infrastruttura critica è &lt;strong&gt;legata a decisioni e proprietà personali&lt;/strong&gt;, il rischio non è teorico.&lt;/p&gt;

&lt;p&gt;Questa tensione (open source vs controllo operativo) esiste da anni in tanti progetti: puoi avere codice aperto e comunità attiva, ma se:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;la governance è fortemente centralizzata;&lt;/li&gt;
&lt;li&gt;le leve operative (accessi, canali, infrastrutture, domini) sono in poche mani;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…allora il sistema è tecnicamente aperto, ma politicamente fragile.&lt;/p&gt;

&lt;p&gt;Per chi sviluppa prodotti su WordPress (o su qualunque piattaforma/marketplace), la domanda pratica è sempre la stessa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;quanto è sostituibile la dipendenza?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;esiste un piano B per aggiornamenti, distribuzione, continuità operativa?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Implicazioni pratiche per chi fa frontend e lavora con WordPress (o con piattaforme simili)
&lt;/h2&gt;

&lt;p&gt;Non serve fare doomscrolling sulla governance per trarne valore. Basta trasformare l’episodio in checklist operative:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Riduci il lock-in della supply chain&lt;/strong&gt;: dove possibile, pipeline di deploy e aggiornamenti sotto controllo del team (mirror, policy di pinning, staging robusto).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gestisci aggiornamenti come change management&lt;/strong&gt;: niente auto-update “ciechi” su produzione senza canary/staging, soprattutto per plugin critici.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Traccia dipendenze e criticità&lt;/strong&gt;: sapere quali plugin sono “core business” e chi li mantiene è risk management, non paranoia.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Piano di emergenza&lt;/strong&gt;: backup reali, procedure di rollback testate, alternative documentate.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Sintesi: il costo reale non sono gli 8 milioni
&lt;/h2&gt;

&lt;p&gt;L’episodio colpisce per la cifra e per la rapidità — &lt;strong&gt;33 ore&lt;/strong&gt; possono bastare per bruciare milioni — ma la lezione più utile è un’altra: &lt;strong&gt;la tecnologia non vive in un vuoto&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Governance, controllo del voto e proprietà delle infrastrutture determinano quanto un ecosistema sia prevedibile. E per chi costruisce interfacce, ecommerce, contenuti e prodotti sopra piattaforme dominanti, prevedibilità significa una cosa sola: &lt;strong&gt;rischio misurabile&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Quando quel rischio cambia improvvisamente, non lo risolvi con un nuovo framework: lo risolvi con architettura, processi e un minimo di strategia di indipendenza.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/33-ore-8-milioni-e-una-lezione-scomoda-cosa-insegna-il-quasi-ribaltone-in-automa" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/33-ore-8-milioni-e-una-lezione-scomoda-cosa-insegna-il-quasi-ribaltone-in-automa&lt;/a&gt;&lt;/p&gt;

</description>
      <category>governanceaziendale</category>
      <category>wordpressorg</category>
      <category>opensourceepotere</category>
      <category>boardofdirectors</category>
    </item>
    <item>
      <title>Swipe to remove sul web moderno: un’implementazione fluida con Scroll Snap, Intersection Observer e Web Animations</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Wed, 23 Sep 2026 10:53:39 +0000</pubDate>
      <link>https://dev.to/frontendfacile/swipe-to-remove-sul-web-moderno-unimplementazione-fluida-con-scroll-snap-intersection-observer-e-1beb</link>
      <guid>https://dev.to/frontendfacile/swipe-to-remove-sul-web-moderno-unimplementazione-fluida-con-scroll-snap-intersection-observer-e-1beb</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Come costruire un gesto “swipe per rimuovere” stabile, performante e cross‑browser senza finire in codice fragile e animazioni a scatti.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Costruire un gesto di &lt;strong&gt;swipe per rimuovere&lt;/strong&gt; (tipico delle app mobile) in un’interfaccia web è uno di quei compiti che sembrano semplici finché non ci sbatti contro: gestione del touch, soglie, inertia, conflitti con lo scroll, animazioni che “saltano” e mille edge case.&lt;/p&gt;

&lt;p&gt;Un approccio più solido consiste nel &lt;strong&gt;smettere di “simulare”&lt;/strong&gt; la fisica a mano e appoggiarsi il più possibile a primitive native della piattaforma. Una combinazione particolarmente efficace è:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CSS Scroll Snap&lt;/strong&gt;: per rendere naturale il gesto di trascinamento e l’aggancio a posizioni predefinite.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Intersection Observer&lt;/strong&gt;: per capire in modo affidabile quando l’utente ha “superato la soglia” di rimozione.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web Animations API&lt;/strong&gt;: per animare in modo fluido la rimozione (collasso, fade, slide out) senza layout thrashing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Di seguito un modello mentale e una struttura che puoi adattare a liste, inbox, carrelli, notifiche.&lt;/p&gt;




&lt;h2&gt;
  
  
  1) Il pattern: uno “snap” tra stato normale e stato rimuovi
&lt;/h2&gt;

&lt;p&gt;L’idea è costruire ogni riga come un piccolo &lt;strong&gt;contenitore scrollabile orizzontalmente&lt;/strong&gt; con due “pagine”:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Stato normale&lt;/strong&gt;: la card/item principale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stato azione&lt;/strong&gt;: area a destra (o sinistra) che rappresenta l’azione di rimozione.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Con &lt;strong&gt;scroll-snap&lt;/strong&gt; l’utente trascina, il browser gestisce inerzia e decelerazione, e l’item “aggancia” in modo prevedibile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Struttura HTML indicativa
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"row"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"swipe"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"pane pane--content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="c"&gt;&amp;lt;!-- contenuto dell’item --&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;Messaggio&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Anteprima...&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"pane pane--remove"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Rimuovi"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      Rimuovi
    &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CSS: scroll-snap “a pagine”
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.row&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;list-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.swipe&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;grid-auto-flow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;grid-auto-columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nl"&gt;overflow-x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;overscroll-behavior-x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;contain&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;scroll-snap-type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;mandatory&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;-webkit-overflow-scrolling&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;touch&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;scrollbar-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.swipe&lt;/span&gt;&lt;span class="nd"&gt;::-webkit-scrollbar&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.pane&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;scroll-snap-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.pane--remove&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;place-items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;background&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#d92c2c&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;white&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con questa base ottieni già una gesture utilizzabile: trascinamento orizzontale, snapping e un’area “Rimuovi” raggiungibile.&lt;/p&gt;




&lt;h2&gt;
  
  
  2) La soglia di rimozione con Intersection Observer
&lt;/h2&gt;

&lt;p&gt;Il passo successivo è determinare quando considerare l’azione “confermata”. Puoi farlo in due modi tipici:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Swipe fino allo snap dell’area remove&lt;/strong&gt; → rimuovi automaticamente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Swipe parziale&lt;/strong&gt; → mostra l’azione e richiedi un tap su “Rimuovi”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per evitare calcoli manuali basati su &lt;code&gt;scrollLeft&lt;/code&gt; e dimensioni (fragili con font, zoom, RTL, layout responsive), puoi usare un &lt;strong&gt;sentinel&lt;/strong&gt; osservato.&lt;/p&gt;

&lt;p&gt;Esempio: inserisci un piccolo elemento “marker” all’inizio della seconda pagina (remove) e osserva quando entra sufficientemente in view.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"pane pane--remove"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"sentinel"&lt;/span&gt; &lt;span class="na"&gt;aria-hidden=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  Rimuovi
&lt;span class="nt"&gt;&amp;lt;/div&amp;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 css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.sentinel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1px&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 javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;swipeEls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelectorAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.swipe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;swipeEls&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;swipeEl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sentinel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;swipeEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.pane--remove .sentinel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;sentinel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;io&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IntersectionObserver&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// entry.isIntersecting + threshold gestiscono la “soglia”&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isIntersecting&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;intersectionRatio&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;swipeEl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatchEvent&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;CustomEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;swipe:readyToRemove&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;bubbles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;swipeEl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;io&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sentinel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Questa soluzione è robusta perché:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;non dipende da frame-by-frame JS durante il drag;&lt;/li&gt;
&lt;li&gt;delega al browser la parte complessa (scroll + inertia);&lt;/li&gt;
&lt;li&gt;rende semplice cambiare la soglia (es. 0.5, 0.7) senza rifare matematica.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3) Rimozione fluida con Web Animations API (senza reflow a raffica)
&lt;/h2&gt;

&lt;p&gt;Quando decidi di rimuovere l’item, l’effetto “giusto” non è solo farlo sparire, ma:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;dare feedback (fade/slide);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;collassare lo spazio&lt;/strong&gt; nella lista in modo elegante.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Una sequenza comune:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;anima l’opacità e un leggero translate;&lt;/li&gt;
&lt;li&gt;poi anima l’altezza da &lt;code&gt;offsetHeight&lt;/code&gt; a &lt;code&gt;0&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;swipe:readyToRemove&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;swipeEl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.swipe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;closest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;.row&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;swipeEl&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// evita doppi trigger&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removing&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;true&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// 1) feedback visivo&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;translateX(0px)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;translateX(-8px)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;160&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;easing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ease-out&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;forwards&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;finished&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// 2) collasso&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;offsetHeight&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;px`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;overflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;clip&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;animate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;h&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;px`&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0px&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;easing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ease-in&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;fill&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;forwards&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;finished&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nota: per accessibilità e controllo, spesso conviene &lt;strong&gt;non rimuovere automaticamente&lt;/strong&gt; al primo superamento soglia, ma richiedere conferma (tap su bottone) o offrire undo. Il pattern sopra è un buon “motore” su cui costruire queste scelte di UX.&lt;/p&gt;




&lt;h2&gt;
  
  
  4) Compatibilità e fallback: cosa fare quando manca una feature
&lt;/h2&gt;

&lt;p&gt;Le primitive citate sono in gran parte ben supportate. Dove tipicamente sorgono problemi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;comportamenti specifici legati allo scroll&lt;/strong&gt; (es. particolari proprietà CSS meno diffuse);&lt;/li&gt;
&lt;li&gt;differenze di feeling tra browser su inerzia e snapping.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Strategia pratica:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Progressive enhancement&lt;/strong&gt;: se &lt;code&gt;scroll-snap-type&lt;/code&gt; non è disponibile, mantieni un’interazione base (tap su “Rimuovi”).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feature detection&lt;/strong&gt; in CSS e JS:

&lt;ul&gt;
&lt;li&gt;CSS: &lt;code&gt;@supports (scroll-snap-type: x mandatory) { ... }&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;JS: controlli su API (&lt;code&gt;'IntersectionObserver' in window&lt;/code&gt;, &lt;code&gt;'animate' in Element.prototype&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alternative semplici&lt;/strong&gt;: se manca Web Animations, passa a transizioni CSS; se manca Intersection Observer, degrada a controllo &lt;code&gt;scrollLeft&lt;/code&gt; su &lt;code&gt;scrollend&lt;/code&gt; (o un debounce su &lt;code&gt;scroll&lt;/code&gt;).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;L’obiettivo non è inseguire la perfezione identica ovunque, ma garantire:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gesto naturale dove supportato;&lt;/li&gt;
&lt;li&gt;comportamento coerente (niente stati bloccati);&lt;/li&gt;
&lt;li&gt;fallback funzionale.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Sintesi: meno “gesture logic”, più piattaforma
&lt;/h2&gt;

&lt;p&gt;Uno swipe-to-remove ben fatto non nasce da decine di listener touch e calcoli per-frame. La via moderna è &lt;strong&gt;comporre primitive native&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scroll Snap per rendere lo swipe prevedibile e fisico “gratis”;&lt;/li&gt;
&lt;li&gt;Intersection Observer per decidere soglie e stati in modo affidabile;&lt;/li&gt;
&lt;li&gt;Web Animations per una rimozione fluida senza scatti.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il risultato è un’interazione più stabile, più semplice da mantenere e più facile da far evolvere (undo, multi-azioni, layout diversi) senza trasformare ogni lista in un mini motore di gesture.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/swipe-to-remove-sul-web-moderno-un-implementazione-fluida-con-scroll-snap-inters" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/swipe-to-remove-sul-web-moderno-un-implementazione-fluida-con-scroll-snap-inters&lt;/a&gt;&lt;/p&gt;

</description>
      <category>scrollsnap</category>
      <category>intersectionobserver</category>
      <category>webanimations</category>
      <category>gesturetouch</category>
    </item>
    <item>
      <title>Opus 5.5 alza l’asticella (e abbassa i costi): cosa cambia davvero per chi sviluppa</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Wed, 23 Sep 2026 10:48:38 +0000</pubDate>
      <link>https://dev.to/frontendfacile/opus-55-alza-lasticella-e-abbassa-i-costi-cosa-cambia-davvero-per-chi-sviluppa-3i66</link>
      <guid>https://dev.to/frontendfacile/opus-55-alza-lasticella-e-abbassa-i-costi-cosa-cambia-davvero-per-chi-sviluppa-3i66</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Prestazioni da top di gamma, prezzo in caduta e nuovi meccanismi di rate limit: l’effetto pratico su coding, UI e workflow creativi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Negli ultimi mesi ci siamo abituati a un pattern abbastanza stabile: ogni salto di qualità nei modelli “premium” tende a portarsi dietro un conto più salato, rate limit più stretti o compromessi sull’accessibilità. Opus 5.5 rompe questo schema in modo piuttosto netto: &lt;strong&gt;prestazioni che lo collocano nella fascia alta&lt;/strong&gt; (in pratica comparabile ai migliori modelli cloud “da produzione”) e &lt;strong&gt;costi inferiori&lt;/strong&gt; rispetto alla generazione precedente.&lt;/p&gt;

&lt;p&gt;Al di là dell’hype, la domanda utile per chi fa frontend è: &lt;em&gt;che cosa abilita davvero, nel lavoro quotidiano?&lt;/em&gt; E cosa cambia nell’equilibrio tra “modello migliore” e “modello sostenibile” quando si lavora a colpi di prompt, refactor e iterazioni UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  1) Non è solo “scrive codice”: è densità di prodotto in meno tempo
&lt;/h2&gt;

&lt;p&gt;Uno dei segnali più interessanti non è il singolo snippet perfetto, ma la capacità di generare &lt;strong&gt;artefatti completi&lt;/strong&gt;: esperienze interattive, prototipi giocabili, animazioni su canvas, UI con logica e stato coerenti.&lt;/p&gt;

&lt;p&gt;In questa ondata di esempi si vede un pattern chiaro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Single-file app&lt;/strong&gt; non banali (anche corpose) che includono rendering, input, stato di gioco, audio/animazioni e loop di aggiornamento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Canvas/animazioni&lt;/strong&gt; con output “pulito”: timing, easing, gestione delle dimensioni, ridisegno efficiente.&lt;/li&gt;
&lt;li&gt;Prototipi che sembrano “da team”, non da demo: controlli, fisica, camera, assets/texture, un minimo di architettura.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per chi sviluppa frontend, questo si traduce in una cosa concreta: &lt;strong&gt;aumenta la complessità massima del prototipo che riesci a esplorare prima di decidere&lt;/strong&gt; (o prima di coinvolgere il resto del team). Meno tempo speso a “dimostrare che si può fare”, più tempo su UX, vincoli e scelte.&lt;/p&gt;

&lt;h3&gt;
  
  
  Implicazione pratica
&lt;/h3&gt;

&lt;p&gt;Se fino a ieri usavi il modello top solo per task ad alto valore (refactor difficili, debug di edge case, architetture), ora diventa realistico usarlo anche per:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prototipi interattivi di feature (micro-frontend, configuratori, editor);&lt;/li&gt;
&lt;li&gt;playground canvas/WebGL e data-viz;&lt;/li&gt;
&lt;li&gt;scaffolding di design system + esempi reali di utilizzo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2) Benchmark: utili, ma conta “la resa” su task agentici
&lt;/h2&gt;

&lt;p&gt;I benchmark restano una fotografia imperfetta. Però un punto emerge: Opus 5.5 risulta molto competitivo su &lt;strong&gt;task agentici e coding-oriented&lt;/strong&gt; (quelli dove il modello deve pianificare, iterare, correggersi).&lt;/p&gt;

&lt;p&gt;Per un frontend engineer questa è la differenza tra:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un modello che “indovina” la prima risposta e poi si perde,&lt;/li&gt;
&lt;li&gt;e un modello che &lt;strong&gt;tiene il contesto&lt;/strong&gt;, fa troubleshooting con metodo e converge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Non è glamour, ma è ciò che incide sul tempo totale quando gli chiedi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;di riparare una regressione CSS introdotta da una refactor;&lt;/li&gt;
&lt;li&gt;di analizzare un bug di stato in un componente complesso;&lt;/li&gt;
&lt;li&gt;di migrare una codebase (router, store, test) senza rompere tutto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3) Il punto vero: il prezzo cambia le abitudini
&lt;/h2&gt;

&lt;p&gt;La parte più “di prodotto” di questo rilascio è la riduzione di costo. Se un modello arriva a livelli molto alti e contemporaneamente costa sensibilmente meno da eseguire, succedono almeno tre cose:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lo usi più spesso&lt;/strong&gt;, anche per task intermedi (non solo per “salvataggi in extremis”).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aumenti il numero di iterazioni&lt;/strong&gt;: più prompt, più alternative, più tentativi A/B su implementazioni.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lo metti in pipeline&lt;/strong&gt;: linters “intelligenti”, generatori di test, review assistita, refactor programmati.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Per il frontend moderno (dove il costo nascosto è l’iterazione continua), questo è enorme: il modello smette di essere “un consulente costoso” e diventa &lt;strong&gt;una parte della toolchain&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4) Accesso e velocità: quando la UX del modello diventa una feature
&lt;/h2&gt;

&lt;p&gt;Oltre al costo per token, contano i limiti d’uso e la prevedibilità.&lt;/p&gt;

&lt;p&gt;Due segnali interessanti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Aumento dei limiti orari&lt;/strong&gt; sui piani in abbonamento.&lt;/li&gt;
&lt;li&gt;Introduzione di un concetto di &lt;strong&gt;reset “bancabile”&lt;/strong&gt; del rate limit: in pratica, la possibilità di conservare un reset e usarlo quando serve (utile nei picchi: release, incident, refactor massivi).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per un team, questa è una differenza concreta: invece di “sperare” che il modello sia disponibile quando ti serve, inizi a gestire l’uso in modo più razionale (quasi come si fa con i budget di CI).&lt;/p&gt;

&lt;h2&gt;
  
  
  5) E Fable? Più che una guerra, un riequilibrio
&lt;/h2&gt;

&lt;p&gt;Quando un nuovo modello arriva “allo stesso livello” del riferimento più amato per coding, la domanda non è solo “chi è migliore”, ma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;chi è migliore per euro speso&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;chi regge meglio il carico di lavoro reale (contesti lunghi, codebase sporche, vincoli di prodotto);&lt;/li&gt;
&lt;li&gt;chi si integra meglio nei flussi quotidiani.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se Opus 5.5 mantiene davvero questa combinazione di qualità e costo, l’effetto più probabile è un &lt;strong&gt;riposizionamento&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fable resta un riferimento per certe nicchie e per chi ha già pipeline ottimizzate su quel modello.&lt;/li&gt;
&lt;li&gt;Opus 5.5 diventa la scelta “default” per molti team che vogliono qualità alta ma sostenibile.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In altre parole: non è detto che uno “uccida” l’altro. È più realistico che cambi la percentuale d’uso, soprattutto nelle attività dove oggi si risparmia per non sforare costi.&lt;/p&gt;

&lt;h2&gt;
  
  
  6) Una nota sul tema “pacing” e frontiera
&lt;/h2&gt;

&lt;p&gt;C’è un tema di coerenza di mercato: da un lato si parla di “rallentare la corsa” (pacing), dall’altro escono modelli più capaci e più economici.&lt;/p&gt;

&lt;p&gt;A livello pratico, per chi costruisce prodotti, la conseguenza è semplice: la “frontiera” diventa meno un concetto astratto e più una &lt;strong&gt;linea di accesso&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;modelli utilizzabili con guardrail e policy;&lt;/li&gt;
&lt;li&gt;modelli più “sensibili” con accessi ristretti o capacità limitate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per noi sviluppatori, il tema etico e di governance resta importante, ma il segnale industriale è chiaro: &lt;strong&gt;la competizione si sta spostando sul rapporto qualità/prezzo e sull’esperienza d’uso&lt;/strong&gt;, non solo sulla potenza pura.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sintesi: cosa fare adesso, da frontend
&lt;/h2&gt;

&lt;p&gt;Se lavori su UI complesse, prototipi interattivi, data-viz o tool interni, Opus 5.5 è il tipo di rilascio che cambia le abitudini perché &lt;strong&gt;riduce il “costo dell’iterazione”&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;L’implicazione pratica è questa: ha senso trattarlo come un upgrade “di qualità” &lt;em&gt;e&lt;/em&gt; “di budget”, e rivedere i tuoi workflow di conseguenza.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Usa i modelli top non solo per risolvere bug difficili, ma per &lt;strong&gt;aumentare il throughput&lt;/strong&gt; (più varianti, più esperimenti).&lt;/li&gt;
&lt;li&gt;Sposta nel modello task ripetitivi ma time-consuming (test, refactor guidati, migrazioni incrementali).&lt;/li&gt;
&lt;li&gt;Valuta la toolchain con un criterio nuovo: &lt;strong&gt;quanto mi costa una settimana di iterazioni&lt;/strong&gt;, non solo “quanto costa una singola risposta”.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/opus-5-5-alza-l-asticella-e-abbassa-i-costi-cosa-cambia-davvero-per-chi-sviluppa" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/opus-5-5-alza-l-asticella-e-abbassa-i-costi-cosa-cambia-davvero-per-chi-sviluppa&lt;/a&gt;&lt;/p&gt;

</description>
      <category>llmpercoding</category>
      <category>prototipazioneui</category>
      <category>benchmarkagentici</category>
      <category>costitoken</category>
    </item>
    <item>
      <title>Sviluppare software nel 2026: più codice, meno “mani”, nuove regole di affidabilità</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Tue, 22 Sep 2026 11:34:51 +0000</pubDate>
      <link>https://dev.to/frontendfacile/sviluppare-software-nel-2026-piu-codice-meno-mani-nuove-regole-di-affidabilita-2ih2</link>
      <guid>https://dev.to/frontendfacile/sviluppare-software-nel-2026-piu-codice-meno-mani-nuove-regole-di-affidabilita-2ih2</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Gli agenti aumentano la produttività individuale, ma senza ripensare delivery e governance il risultato è solo più rumore (e più costi).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Negli ultimi 18–24 mesi lo sviluppo software ha iniziato a somigliare meno a una catena di montaggio fatta di persone e più a un sistema operativo fatto di agenti. Il cambio di passo non è solo “scrivo più velocemente”: è un cambio di scala. La quantità di codice prodotta può crescere di ordini di grandezza, e questo mette in crisi i meccanismi tradizionali con cui abbiamo governato qualità, sicurezza e delivery negli ultimi dieci anni.&lt;/p&gt;

&lt;p&gt;In questo scenario, molte convinzioni “da manuale” iniziano a scricchiolare: la code review come collo di bottiglia virtuoso, l’onboarding dei junior tramite task semplici, la crescita della capacità tramite hiring e offshore. Funzionavano quando il costo principale era &lt;em&gt;scrivere&lt;/em&gt; codice. Ora il costo sta diventando &lt;em&gt;capire, verificare e rendere affidabile&lt;/em&gt; ciò che viene prodotto.&lt;/p&gt;

&lt;h2&gt;
  
  
  1) La produttività individuale esplode, quella organizzativa no
&lt;/h2&gt;

&lt;p&gt;Con agenti e tool AI, il singolo sviluppatore (o il singolo team piccolo) può passare dall’idea al prototipo in minuti o ore. In una startup snella questo si traduce spesso in shipping reale: meno coordinamento, meno dipendenze, meno cerimonie.&lt;/p&gt;

&lt;p&gt;Nelle aziende grandi, però, lo stesso incremento non si materializza automaticamente a livello di “azienda”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;si acquistano licenze e si consumano token;&lt;/li&gt;
&lt;li&gt;tante persone usano AI “a lato” del lavoro;&lt;/li&gt;
&lt;li&gt;ma metriche di output (time-to-market, qualità, costi operativi, throughput end-to-end) migliorano poco o in modo non lineare.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il punto non è lo strumento: è il processo. Senza trasformare il modo in cui il lavoro attraversa l’SDLC, il risultato è spesso un backlog che scorre più velocemente… verso nuovi colli di bottiglia (review, compliance, QA, incidenti, debito tecnico).&lt;/p&gt;

&lt;h2&gt;
  
  
  2) Dalla “capacity” al “value”: cambia l’aspettativa sul delivery
&lt;/h2&gt;

&lt;p&gt;Fino a poco tempo fa, molte organizzazioni compravano capacità: più persone, a costo medio più basso, per consegnare funzionalità.&lt;/p&gt;

&lt;p&gt;Oggi la conversazione si sta spostando su due richieste molto più dure:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;più valore allo stesso costo&lt;/strong&gt;, oppure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;lo stesso valore con meno persone&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Questo genera una pressione immediata su team interni e fornitori: non basta “essere pieni”, serve dimostrare che la pipeline produce outcome misurabili. In parallelo cresce un effetto collaterale: la paura di restare indietro rispetto ai competitor porta a sperimentazioni rapide e spesso poco strutturate, con adozioni di AI non dichiarate o non standardizzate.&lt;/p&gt;

&lt;h2&gt;
  
  
  3) Code review tradizionale: non regge l’esplosione del codice
&lt;/h2&gt;

&lt;p&gt;Quando il volume di modifiche passa da “migliaia di righe a settimana” a “centinaia di migliaia”, la code review manuale perde il suo ruolo storico. Non perché sia inutile in assoluto, ma perché diventa matematicamente impossibile mantenere lo stesso livello di attenzione umana su tutto.&lt;/p&gt;

&lt;p&gt;In più, la review umana è variabile: chiunque abbia lavorato in team grandi ha visto pull request enormi chiuse con un “LGTM” frettoloso. Con l’aumento della velocità, quel comportamento non è un’eccezione: rischia di diventare la norma.&lt;/p&gt;

&lt;h3&gt;
  
  
  La direzione che sta emergendo: “reliability realms”
&lt;/h3&gt;

&lt;p&gt;Un approccio pragmatico è trattare i sistemi in modo diverso in base alla criticità:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;core critico&lt;/strong&gt;: cambi piccoli, revisione accurata, presenza umana più forte;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sistemi meno critici&lt;/strong&gt;: progressiva autonomia degli agenti per valutazione, review e deploy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questo è interessante perché sposta la domanda da “chi approva la PR?” a “quale livello di garanzia mi serve qui, e come lo ottengo?”—un cambio mentale molto più sano per architetture moderne.&lt;/p&gt;

&lt;h2&gt;
  
  
  4) Se gli agenti scrivono codice, il lavoro umano si sposta su orchestrazione e governance
&lt;/h2&gt;

&lt;p&gt;Quando “scrivere” non è più il collo di bottiglia, la competenza distintiva diventa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;definire &lt;strong&gt;specifiche verificabili&lt;/strong&gt; (non solo desideri);&lt;/li&gt;
&lt;li&gt;progettare &lt;strong&gt;guardrail&lt;/strong&gt; (sicurezza, policy, compliance);&lt;/li&gt;
&lt;li&gt;costruire &lt;strong&gt;processi agent-led&lt;/strong&gt; che producano artefatti affidabili: test, prove, tracciabilità, rollback, osservabilità;&lt;/li&gt;
&lt;li&gt;scegliere &lt;em&gt;dove&lt;/em&gt; l’autonomia è accettabile e &lt;em&gt;dove&lt;/em&gt; no.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In pratica, il team non “perde” lavoro: lo cambia. E chi guida engineering deve abituarsi a gestire sistemi che non si stancano, non vanno in ferie, non negoziano priorità—ma che possono amplificare errori e ambiguità con la stessa velocità con cui amplificano output.&lt;/p&gt;

&lt;h2&gt;
  
  
  5) Junior developer e apprendistato: il problema non è assumere, è creare compiti reali
&lt;/h2&gt;

&lt;p&gt;C’è un segnale chiaro: i task “da junior” (pulizia, CRUD ripetitivo, pezzi marginali) sono esattamente quelli che gli agenti assorbono meglio. Questo crea un vuoto di apprendistato: meno occasioni di “imparare facendo” su lavoro produttivo.&lt;/p&gt;

&lt;p&gt;Due conseguenze pratiche:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;le aziende che vogliono formare junior devono investire&lt;/strong&gt;: non possono più contare sul fatto che il junior sia produttivo dal giorno 1 su compiti semplici a margine del delivery.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;si alza l’asticella dell’“agency”&lt;/strong&gt;: viene premiato chi sa prendere in carico un problema end-to-end, fare domande giuste, guidare l’esecuzione con strumenti e agenti, e rendere il risultato verificabile.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questa non è una “fine dei junior”, ma un cambiamento del loro percorso: meno manovalanza, più responsabilità guidata.&lt;/p&gt;

&lt;h2&gt;
  
  
  6) Selezione naturale tra senior: non basta esperienza, serve moltiplicare valore
&lt;/h2&gt;

&lt;p&gt;In un mondo agentico, il senior non è prezioso solo perché “sa fare”, ma perché:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sa creare contesto e vincoli corretti;&lt;/li&gt;
&lt;li&gt;sa costruire sistemi di verifica;&lt;/li&gt;
&lt;li&gt;sa ridurre rischio e aumentare affidabilità mentre la velocità aumenta;&lt;/li&gt;
&lt;li&gt;sa trasformare produttività individuale in produttività di squadra e di organizzazione.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;È qui che si separano “anni di esperienza” da “capacità di moltiplicare output con qualità”.&lt;/p&gt;




&lt;h2&gt;
  
  
  Sintesi operativa: cosa fare in un team frontend oggi
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tratta la code review come una risorsa scarsa&lt;/strong&gt;: riservala alle parti critiche e sposta il resto su test, policy e automazioni.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Definisci livelli di criticità&lt;/strong&gt; (reliability realms) per componenti, servizi e pipeline: non tutto merita lo stesso rigore umano.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Riprogetta l’SDLC attorno agli agenti&lt;/strong&gt;: specifiche, verifiche, tracciabilità e osservabilità devono essere “first-class”.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per i junior, crea percorsi di valore&lt;/strong&gt;: task piccoli sì, ma agganciati a risultati misurabili e con guardrail; altrimenti l’apprendistato si spegne.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;La direzione è chiara: la velocità di scrittura del codice non sarà più il vantaggio competitivo. Lo sarà la capacità di trasformare quell’abbondanza in software affidabile, sicuro e sostenibile—senza far collassare processi, persone e qualità lungo la strada.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/sviluppare-software-nel-2026-piu-codice-meno-mani-nuove-regole-di-affidabilita" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/sviluppare-software-nel-2026-piu-codice-meno-mani-nuove-regole-di-affidabilita&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agentiai</category>
      <category>sdcl</category>
      <category>codereview</category>
      <category>governance</category>
    </item>
    <item>
      <title>Progettare prodotti “AI‑native” per un’intelligenza che cresce: meno guardrail, più accesso al root</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Tue, 22 Sep 2026 11:29:50 +0000</pubDate>
      <link>https://dev.to/frontendfacile/progettare-prodotti-ai-native-per-unintelligenza-che-cresce-meno-guardrail-piu-accesso-al-root-dpp</link>
      <guid>https://dev.to/frontendfacile/progettare-prodotti-ai-native-per-unintelligenza-che-cresce-meno-guardrail-piu-accesso-al-root-dpp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Quando i modelli migliorano, le regole a mano diventano debito tecnico. Tre principi per costruire interfacce e architetture che scalano con l’intelligenza.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Negli ultimi due anni abbiamo visto uno schema ricorrente nei prodotti AI‑native: appena l’output del modello “non è abbastanza”, la reazione istintiva è costruire strati di controllo. Validazioni, post‑processing, SDK semplificati, workflow rigidi. Il risultato, spesso, è un prodotto che sembra più affidabile nel breve periodo.&lt;/p&gt;

&lt;p&gt;Poi arriva un nuovo modello, molto più capace.&lt;/p&gt;

&lt;p&gt;E succede una cosa scomoda: &lt;strong&gt;quello che avevamo codificato come intelligenza di dominio diventa improvvisamente rumore&lt;/strong&gt;. A volte addirittura un vincolo che impedisce al prodotto di beneficiare del salto di qualità del modello.&lt;/p&gt;

&lt;p&gt;Questa dinamica non è un incidente: è un pattern prevedibile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Il problema: i guardrail “vincono” oggi e perdono domani
&lt;/h2&gt;

&lt;p&gt;All’inizio, quando il modello sbaglia spesso, i guardrail sono tentatori perché:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;riducono gli errori più frequenti (UI rotte, API sbagliate, asset mancanti);&lt;/li&gt;
&lt;li&gt;rendono l’esperienza più uniforme;&lt;/li&gt;
&lt;li&gt;permettono di “vendere affidabilità” senza addestrare modelli.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esempi tipici (soprattutto in prodotti che generano codice o UI):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;lint custom&lt;/strong&gt; per intercettare pattern errati e rimandare feedback al modello;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;post‑processing&lt;/strong&gt; per correggere automaticamente risorse inesistenti (icone, font, nomi di componenti);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SDK semplificati&lt;/strong&gt; per far usare feature complesse (streaming, URL corretti, tool AI) evitando gli errori più comuni;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;workflow a binari&lt;/strong&gt; (pubblicazione store, deploy, release) ridotti a una macro‑procedura.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nel breve periodo funziona. Ma nel medio periodo emergono due effetti:&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;Ogni regola a mano invecchia&lt;/strong&gt;: il modello impara a fare meglio proprio quell’area e i guardrail diventano ridondanti.&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Le regole a mano diventano un tetto&lt;/strong&gt;: quando il modello sblocca nuove capacità (nuovi framework, nuove API, nuovi paradigmi), quei limiti impediscono al prodotto di “salire di livello”.&lt;/p&gt;

&lt;h3&gt;
  
  
  La “bitter lesson” applicata al product design
&lt;/h3&gt;

&lt;p&gt;C’è un principio che torna ciclicamente nell’AI: i metodi che scalano con compute e apprendimento tendono a superare nel tempo le soluzioni basate su conoscenza codificata a mano.&lt;/p&gt;

&lt;p&gt;Tradotto per chi progetta prodotti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;aggiungere regole e middleware &lt;strong&gt;sembra intelligente all’inizio&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;ma spesso &lt;strong&gt;blocca la crescita&lt;/strong&gt; quando la base (il modello) fa un salto;&lt;/li&gt;
&lt;li&gt;e psicologicamente è difficile accettare che “compute + modello” batta il nostro design accurato.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se stai costruendo un prodotto AI‑native, la domanda non è “come rendo il modello affidabile oggi?”, ma:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Come progetto un sistema che diventa migliore automaticamente quando il modello migliora?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Un cambio di mentalità: non inseguire affidabilità, rimuovi limiti
&lt;/h2&gt;

&lt;p&gt;La reliability è importante, ma c’è una provocazione utile: &lt;strong&gt;molta affidabilità arriva gratis aspettando il prossimo modello&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Se il tuo vantaggio competitivo è “abbiamo messo guardrail attorno a un modello generalista”, stai giocando una partita fragile: al primo salto generazionale rischi che il modello nudo superi il tuo prodotto.&lt;/p&gt;

&lt;p&gt;L’alternativa è spostare l’ottimizzazione su un’altra dimensione:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ridurre i colli di bottiglia del prodotto&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;dare accesso a capability più profonde&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;togliere i soffitti artificiali&lt;/strong&gt; che impediscono al modello di esprimersi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In pratica: se il tuo prodotto limita framework, piattaforme, primitive di sistema o strumenti “veri” (cloud, deploy, simulatori, gateway), stai limitando l’intelligenza che vorresti vendere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tre regole di design per “growing intelligence”
&lt;/h2&gt;

&lt;p&gt;Di seguito tre principi pratici che funzionano come bussola quando progetti agenti e prodotti che devono scalare con modelli sempre più capaci.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Smetti di inseguire la reliability come obiettivo primario
&lt;/h3&gt;

&lt;p&gt;Non significa ignorare la qualità, ma &lt;strong&gt;non costruire la tua strategia sul correggere il modello&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Chiediti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sto aggiungendo questo strato perché è indispensabile al prodotto… o perché il modello oggi sbaglia?&lt;/li&gt;
&lt;li&gt;se domani il modello fosse 10× migliore, questo layer sarebbe ancora utile o diventerebbe un freno?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I guardrail “anti‑errore” spesso sono debito tecnico mascherato da UX.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Fissa un obiettivo enorme (e usalo come test di progetto)
&lt;/h3&gt;

&lt;p&gt;Un obiettivo grande è uno strumento diagnostico: mette in luce dove il tuo prodotto impone limiti inutili.&lt;/p&gt;

&lt;p&gt;Esempio di framing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;se costruisci un tool per creare app: &lt;strong&gt;“si può costruire un Uber completo?”&lt;/strong&gt; (più piattaforme, più ruoli, backend vero, scalabilità);&lt;/li&gt;
&lt;li&gt;se costruisci un editor video AI: &lt;strong&gt;“un regista esperto può ottenere un risultato da studio?”&lt;/strong&gt; (togliendo dal gioco la “scusa” che l’utente non sappia cosa vuole).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nota interessante: usare un utente “super‑competente” come riferimento aiuta a isolare il problema. Se anche l’utente sa perfettamente cosa vuole, dove si rompe il prodotto? Quella rottura è quasi sempre un limite architetturale o di design.&lt;/p&gt;

&lt;p&gt;Con questo test emergono scelte che all’inizio sembravano ragionevoli (supportare solo una piattaforma, un solo tipo di progetto, un backend “semplice”) ma che impediscono la crescita.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Dai all’AI accesso al “root” (alle primitive, non ai middleware)
&lt;/h3&gt;

&lt;p&gt;Questa è la regola più potente e, spesso, la più contro‑intuitiva.&lt;/p&gt;

&lt;p&gt;Quando incapsuli tutto in livelli intermedi (SDK “friendly”, wrapper, workflow chiusi), stai dicendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“il mondo vero è troppo complesso, lo nascondo dietro un’interfaccia fissa”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ma un modello che cresce diventa sempre più bravo a gestire complessità. Quindi la strategia più scalabile è:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;esporre primitive stabili&lt;/strong&gt; (le azioni fondamentali),&lt;/li&gt;
&lt;li&gt;e lasciare che l’AI componga le strategie sopra di esse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tre applicazioni concrete:&lt;/p&gt;

&lt;p&gt;1) &lt;strong&gt;Gateway invece di SDK proprietari&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Se oggi costruisci un SDK per gestire provider e feature AI, domani quel lavoro invecchia. Esporre un gateway (o una proxy layer minimale) e limitarsi a metering, policy e billing riduce manutenzione e rende il prodotto “future‑proof” rispetto a nuovi modelli.&lt;/p&gt;

&lt;p&gt;2) &lt;strong&gt;Workflow scomposti in azioni&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Pubblicare su uno store, fare release, gestire compliance: non è una funzione unica, è una sequenza piena di edge case. Invece di codificare un flow rigido, conviene esporre le azioni atomiche (upload, signing, metadata, review checks, ecc.) e lasciare che l’AI decida ordine e strategia.&lt;/p&gt;

&lt;p&gt;3) &lt;strong&gt;Rimozione dei middle layer che limitano capability&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
   Ogni “ponte” tecnologico (framework, runtime, compatibilità) può diventare un tappo. Se per ottenere feature reali serve scendere a livello nativo, l’AI deve poterlo fare senza essere bloccata da un’astrazione pensata per un modello meno capace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implicazioni pratiche per chi fa frontend (e prodotti)
&lt;/h2&gt;

&lt;p&gt;Questi principi non sono solo infrastruttura: cambiano anche il modo in cui progetti l’esperienza.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;UI come console di capability&lt;/strong&gt;: meno wizard che impongono un percorso unico, più strumenti componibili (azioni, risorse, permessi, stato).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Osservabilità al posto di regole&lt;/strong&gt;: se non rincorri reliability via guardrail, ti serve telemetria eccellente (errori, costi, latenza, tentativi, rollback) per capire dove intervenire.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permessi e sicurezza come design core&lt;/strong&gt;: dare accesso al “root” significa anche progettare sandbox, policy, rate limit, scope delle credenziali. È qui che il prodotto crea valore reale.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sintesi: progettare per l’intelligenza che cresce
&lt;/h2&gt;

&lt;p&gt;Se l’intelligenza sottostante migliora continuamente, il prodotto deve essere un amplificatore, non una gabbia.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I guardrail possono essere utili come stampelle temporanee, ma diventano rapidamente debito.&lt;/li&gt;
&lt;li&gt;Un obiettivo grande rivela i limiti nascosti del design.&lt;/li&gt;
&lt;li&gt;L’accesso alle primitive (root) rende il sistema più adattivo e “compatibile con il futuro”, perché sposta la complessità dove può evolvere: nel modello e nella sua capacità di pianificare.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La conseguenza pratica è chiara: &lt;strong&gt;costruire prodotti AI‑native oggi significa progettare meno regole e più possibilità&lt;/strong&gt;, con un’architettura che non abbia paura dei prossimi salti di modello, ma che li trasformi automaticamente in valore per gli utenti.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/progettare-prodotti-ai-native-per-un-intelligenza-che-cresce-meno-guardrail-piu-" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/progettare-prodotti-ai-native-per-un-intelligenza-che-cresce-meno-guardrail-piu-&lt;/a&gt;&lt;/p&gt;

</description>
      <category>prodottiainative</category>
      <category>guardrailedebitotecn</category>
      <category>bitterlesson</category>
      <category>agentdesign</category>
    </item>
    <item>
      <title>Oltre i componenti: come cambia la UI quando la genera un modello (e non solo il dev)</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Tue, 22 Sep 2026 11:24:49 +0000</pubDate>
      <link>https://dev.to/frontendfacile/oltre-i-componenti-come-cambia-la-ui-quando-la-genera-un-modello-e-non-solo-il-dev-4n0p</link>
      <guid>https://dev.to/frontendfacile/oltre-i-componenti-come-cambia-la-ui-quando-la-genera-un-modello-e-non-solo-il-dev-4n0p</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Dallo SPA “a props” alla UI dichiarativa e fino alle interfacce davvero generative: vantaggi, limiti e un’idea più concreta del futuro.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Negli ultimi anni abbiamo visto un’accelerazione brutale: prima il flusso era “copio-incolla un componente React, lo aggiusto, ripeto”; poi siamo passati a modelli capaci di generare schermate complete con interazioni sensate e attenzione all’accessibilità. A quel punto la domanda non è più &lt;em&gt;se&lt;/em&gt; un modello sappia costruire UI, ma &lt;em&gt;come&lt;/em&gt; vogliamo che lo faccia — e quali garanzie servono per portare quel risultato in un prodotto reale.&lt;/p&gt;

&lt;p&gt;Il tema interessante, oggi, non è soltanto &lt;strong&gt;dove&lt;/strong&gt; vive l’interfaccia (dentro un agente “super-app”, dentro il tuo prodotto, dentro un client che integra servizi esterni). È soprattutto &lt;strong&gt;come viene generata&lt;/strong&gt;: con componenti predefiniti? con una descrizione strutturata? oppure con markup e logica creati sul momento?&lt;/p&gt;

&lt;p&gt;Qui sotto trovi i tre approcci principali che stanno emergendo, con i relativi trade-off.&lt;/p&gt;




&lt;h2&gt;
  
  
  1) UI a componenti statici: tool call → props → render
&lt;/h2&gt;

&lt;p&gt;È la versione più vicina al frontend tradizionale.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L’agente invoca un tool (o un endpoint)&lt;/li&gt;
&lt;li&gt;Il tool ritorna dati/parametri&lt;/li&gt;
&lt;li&gt;Il client assembla e renderizza &lt;strong&gt;componenti già esistenti&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In pratica è uno schema simile a quello che abbiamo sempre usato: qualcuno “a monte” prepara dati e il client li monta su UI nota. Anche quando la fonte è un agente, il rendering resta vincolato a un catalogo di componenti che &lt;em&gt;hai già&lt;/em&gt; nel prodotto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pro
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Affidabilità alta: UI deterministica&lt;/li&gt;
&lt;li&gt;Accessibilità e design system sotto controllo&lt;/li&gt;
&lt;li&gt;Debug più semplice: lo spazio di variabilità è nei dati&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contro
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Flessibilità bassa: l’agente può solo “colorare dentro le righe”&lt;/li&gt;
&lt;li&gt;Personalizzazione limitata alle varianti previste&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;È un buon punto di partenza, ma non risolve il desiderio di UI davvero dinamiche.&lt;/p&gt;




&lt;h2&gt;
  
  
  2) UI dichiarativa: l’agente scrive JSON, il client compone
&lt;/h2&gt;

&lt;p&gt;Qui l’agente non decide &lt;em&gt;quale componente chiamare&lt;/em&gt;, ma costruisce una &lt;strong&gt;descrizione&lt;/strong&gt; dell’interfaccia (spesso JSON): layout, gerarchie, contenuti, parametri. Poi un renderer traduce quella descrizione in componenti reali.&lt;/p&gt;

&lt;p&gt;Il dettaglio importante: anche qui i componenti restano &lt;strong&gt;predefiniti&lt;/strong&gt; (quindi coerenti con design system e accessibilità), ma l’agente guadagna molta più libertà nel combinare struttura e contenuto.&lt;/p&gt;

&lt;p&gt;Questo modello è parente stretto di ciò che viene spesso chiamato &lt;strong&gt;server-driven UI&lt;/strong&gt;: la “pagina” non è hardcoded nel client, ma arriva come struttura dati che il client sa interpretare.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pro
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ottimo equilibrio: creatività controllata&lt;/li&gt;
&lt;li&gt;Stabilità: catalogo componenti governato dal team&lt;/li&gt;
&lt;li&gt;Personalizzazione spinta senza rigenerare l’app&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contro
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Sei comunque vincolato al catalogo: ciò che non esiste non può apparire&lt;/li&gt;
&lt;li&gt;Serve progettare bene:

&lt;ul&gt;
&lt;li&gt;schema/versioning&lt;/li&gt;
&lt;li&gt;fallback&lt;/li&gt;
&lt;li&gt;validazione&lt;/li&gt;
&lt;li&gt;mapping tra JSON e componenti&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se oggi dovessi scegliere un approccio “da produzione” per UI guidate da agenti, questo è spesso quello più sensato: dinamico, ma con guardrail.&lt;/p&gt;




&lt;h2&gt;
  
  
  3) UI pienamente generativa: il modello produce markup (e talvolta logica)
&lt;/h2&gt;

&lt;p&gt;All’estremo opposto c’è l’approccio più “wow”: il modello genera direttamente HTML/CSS (e spesso anche JS) per presentare dati e flussi.&lt;/p&gt;

&lt;p&gt;È molto utile quando l’obiettivo è &lt;strong&gt;consumare informazioni&lt;/strong&gt; in modo visuale (dashboard al volo, report, spiegazioni interattive, prototipi). L’interfaccia diventa quasi “usa e getta”: viene generata per quella specifica richiesta, poi si passa oltre.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pro
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Libertà totale: non sei limitato a un catalogo&lt;/li&gt;
&lt;li&gt;Velocità di iterazione altissima&lt;/li&gt;
&lt;li&gt;Ottimo per visualizzazioni ad-hoc e prototipi&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Contro (quelli che contano davvero)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Costo&lt;/strong&gt;: generare UI “da zero” continuamente può essere caro&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Incoerenza&lt;/strong&gt;: senza vincoli, ogni render può variare (layout, pattern, stile)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Familiarità&lt;/strong&gt;: gli utenti vogliono ritrovare le cose dove se le aspettano&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sicurezza&lt;/strong&gt;: se generi ed esegui codice (JS), devi sandboxare e limitare in modo serio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questo approccio non è “sbagliato”, ma è &lt;em&gt;difficile&lt;/em&gt; da rendere un’interfaccia di prodotto stabile. Brilla in contesti dove l’output è temporaneo o dove la UI è un artifact che serve soprattutto a capire, esplorare, decidere.&lt;/p&gt;




&lt;h2&gt;
  
  
  Il punto: la UI non è solo output, è collaborazione
&lt;/h2&gt;

&lt;p&gt;C’è un aspetto che spesso viene sottovalutato: la UI generata non dovrebbe essere soltanto una pagina mostrata all’utente, ma uno &lt;strong&gt;spazio di lavoro condiviso&lt;/strong&gt; tra umano e agente.&lt;/p&gt;

&lt;p&gt;Quando puoi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;spostare elementi&lt;/li&gt;
&lt;li&gt;annotare&lt;/li&gt;
&lt;li&gt;modificare un diagramma&lt;/li&gt;
&lt;li&gt;fare “aggiustamenti” manuali&lt;/li&gt;
&lt;li&gt;e poi chiedere all’agente di adattarsi a quelle modifiche&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…non stai più “guardando” una UI. Stai &lt;strong&gt;co-progettando&lt;/strong&gt; con un sistema.&lt;/p&gt;

&lt;p&gt;Questa idea sposta il focus dal “render perfetto” alla &lt;strong&gt;ciclicità dell’interazione&lt;/strong&gt;: il valore arriva quando l’interfaccia diventa un canvas dove l’agente e la persona iterano insieme.&lt;/p&gt;




&lt;h2&gt;
  
  
  Implicazione pratica per chi fa frontend oggi
&lt;/h2&gt;

&lt;p&gt;Se stai costruendo UI con agenti (o prevedi di farlo), la decisione cruciale non è “componenti sì o no”, ma &lt;strong&gt;quali vincoli vuoi imporre&lt;/strong&gt; e &lt;strong&gt;dove&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Se ti serve solidità di prodotto: &lt;strong&gt;UI dichiarativa + catalogo componenti&lt;/strong&gt; è la base più pragmatica.&lt;/li&gt;
&lt;li&gt;Se ti serve esplorazione veloce: &lt;strong&gt;UI generativa&lt;/strong&gt; è potente, ma trattala come artifact, non come superficie primaria.&lt;/li&gt;
&lt;li&gt;Se vuoi il salto di qualità: investi in &lt;strong&gt;collaborazione&lt;/strong&gt; (stato condiviso, editing, feedback loop), non solo in generazione.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sintesi
&lt;/h3&gt;

&lt;p&gt;La “fine dell’era dei componenti” non significa buttare via componenti e design system. Significa riconoscere che, con i modelli, la UI può diventare &lt;strong&gt;una funzione del contesto&lt;/strong&gt;: generata, adattata e negoziata in tempo reale. Il futuro credibile non è una UI che cambia casualmente a ogni prompt, ma un sistema che bilancia creatività e controllo — e che rende la collaborazione uomo-agente la nuova interazione primaria.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/oltre-i-componenti-come-cambia-la-ui-quando-la-genera-un-modello-e-non-solo-il-d" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/oltre-i-componenti-come-cambia-la-ui-quando-la-genera-un-modello-e-non-solo-il-d&lt;/a&gt;&lt;/p&gt;

</description>
      <category>uidichiarativa</category>
      <category>serverdrivenui</category>
      <category>designsystem</category>
      <category>mcpapps</category>
    </item>
    <item>
      <title>Modelli “System 1”: decisioni in millisecondi per agenti, UI e automazioni (anche in locale)</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Tue, 22 Sep 2026 11:19:49 +0000</pubDate>
      <link>https://dev.to/frontendfacile/modelli-system-1-decisioni-in-millisecondi-per-agenti-ui-e-automazioni-anche-in-locale-5159</link>
      <guid>https://dev.to/frontendfacile/modelli-system-1-decisioni-in-millisecondi-per-agenti-ui-e-automazioni-anche-in-locale-5159</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Dalle LLM conversazionali ai modelli di classificazione a scelte finite: più veloci, più economici e spesso più affidabili quando serve decidere, non scrivere.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nel frontend siamo abituati a ragionare in termini di &lt;strong&gt;eventi → stato → decisione → azione&lt;/strong&gt;. È un ciclo semplice, ripetibile, e soprattutto &lt;em&gt;misurabile&lt;/em&gt;. Una buona parte dell’AI “da prodotto”, però, si è infilata negli ultimi anni in un paradigma diverso: quello delle LLM che &lt;strong&gt;generano testo&lt;/strong&gt; e “ragionano” a lungo.&lt;/p&gt;

&lt;p&gt;Sta emergendo una famiglia di modelli progettata con un’idea quasi opposta: niente testo libero, niente divagazioni. Solo &lt;strong&gt;decisioni rapide&lt;/strong&gt; su un insieme finito di scelte. Risultato: latenza bassissima, costi ridotti e un comportamento spesso più controllabile quando l’obiettivo non è scrivere, ma &lt;em&gt;scegliere cosa fare&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  System 1 vs System 2, ma in ottica prodotto
&lt;/h2&gt;

&lt;p&gt;La distinzione torna utile perché descrive bene due modi di progettare l’esperienza:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System 2&lt;/strong&gt;: più lento, deliberativo, “ragionante”. Perfetto per spiegare, scrivere, sintetizzare, fare tutoring, produrre contenuti.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System 1&lt;/strong&gt;: veloce, istintivo, orientato alla scelta. Perfetto per classificare, selezionare un’azione, decidere tra opzioni predefinite.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nel prodotto questo si traduce in una regola pratica:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Se il tuo flusso richiede &lt;em&gt;una decisione ripetibile&lt;/em&gt; (click, next step, routing, label, intent), un modello “System 1” è spesso più adatto di una LLM generalista.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Cosa sono davvero questi modelli: classificazione con output strutturato
&lt;/h2&gt;

&lt;p&gt;Questi modelli non “rispondono” come un chat. Lavorano tipicamente con due ingredienti:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;States&lt;/strong&gt;: lo &lt;em&gt;stato&lt;/em&gt; corrente (testo, contesto, snapshot, metadati) in forma strutturata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Questions&lt;/strong&gt;: domande/decisioni definite come schema, ciascuna con:

&lt;ul&gt;
&lt;li&gt;tipo di risposta (boolean, scelta tra classi, score)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;criteri&lt;/strong&gt; espliciti per guidare la decisione&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Il punto interessante per noi: l’output è quasi sempre &lt;strong&gt;JSON&lt;/strong&gt;, con scelta finale e spesso &lt;strong&gt;probabilità/confidenza&lt;/strong&gt;. Questo apre subito una porta importante: &lt;em&gt;osservabilità&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Perché l’output strutturato è un game changer
&lt;/h3&gt;

&lt;p&gt;Nel frontend e nelle automazioni, testo libero significa edge case continui:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;parsing fragile&lt;/li&gt;
&lt;li&gt;ambiguità&lt;/li&gt;
&lt;li&gt;impossibilità di validare a compile-time&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;validi con Zod/TypeScript&lt;/li&gt;
&lt;li&gt;logghi le decisioni come eventi&lt;/li&gt;
&lt;li&gt;fai fallback quando la confidenza è bassa&lt;/li&gt;
&lt;li&gt;costruisci UI deterministiche (badge, warning, “serve conferma”)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Latenza: perché 30 ms cambiano l’UX
&lt;/h2&gt;

&lt;p&gt;Quando una decisione arriva in ~30–40 ms, il modello smette di essere un “servizio remoto che aspetti” e diventa parte del loop interattivo.&lt;/p&gt;

&lt;p&gt;È la differenza tra:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;assistente&lt;/strong&gt; (ti risponde dopo un po’)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;controllore&lt;/strong&gt; (decide mentre tu agisci)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Per un agente che controlla una UI (browser, app desktop, web app), questa latenza è cruciale: consente catene di micro-decisioni rapide, tipo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;identifica il campo giusto&lt;/li&gt;
&lt;li&gt;decide se è già valorizzato&lt;/li&gt;
&lt;li&gt;sceglie l’azione (click / type / open menu)&lt;/li&gt;
&lt;li&gt;verifica lo stato successivo&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;…ripetendo decine di volte al secondo senza far “sentire” il pensiero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser agents e frontend: la combinazione naturale
&lt;/h2&gt;

&lt;p&gt;Nel mondo degli agenti browser, il problema non è scrivere testo. È:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;capire &lt;em&gt;cosa&lt;/em&gt; c’è nella pagina&lt;/li&gt;
&lt;li&gt;scegliere &lt;em&gt;dove&lt;/em&gt; cliccare&lt;/li&gt;
&lt;li&gt;verificare &lt;em&gt;quando&lt;/em&gt; fermarsi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un modello a scelte finite si presta perfettamente a questo pattern:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Qual è il prossimo step?” → {open_tab, fill_form, click_search, stop}&lt;/li&gt;
&lt;li&gt;“Questo elenco contiene opzioni coerenti con la richiesta?” → {yes/no + confidence}&lt;/li&gt;
&lt;li&gt;“Quale elemento della pagina corrisponde al target?” → {selector A/B/C}&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In pratica, è un “policy model” leggero: dato uno stato, decide un’azione.&lt;/p&gt;

&lt;h2&gt;
  
  
  Esecuzione in locale: perché interessa davvero
&lt;/h2&gt;

&lt;p&gt;L’altra implicazione enorme è che alcuni di questi modelli esistono anche in versione &lt;strong&gt;open weights&lt;/strong&gt; e girano &lt;strong&gt;sulla macchina dell’utente&lt;/strong&gt; (es. laptop Apple Silicon) con prestazioni sorprendenti.&lt;/p&gt;

&lt;p&gt;Per un team frontend/prodotto questo sblocca scenari prima scomodi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;privacy&lt;/strong&gt;: dati che non escono dal dispositivo (email, pagine interne, strumenti aziendali)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;costo&lt;/strong&gt;: automazioni continue senza bruciare budget a ogni iterazione&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;resilienza&lt;/strong&gt;: meno dipendenza da rate limit e disponibilità di servizi esterni&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Non è “solo” ideologia open source: è una scelta architetturale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Come si progetta una decisione robusta (pattern pratico)
&lt;/h2&gt;

&lt;p&gt;Il trucco non è chiedere “cosa ne pensi?”, ma definire bene &lt;em&gt;stato, opzioni e criteri&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) State minimale ma informativo
&lt;/h3&gt;

&lt;p&gt;Inserisci solo ciò che serve per decidere:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;testo (email, snippet pagina)&lt;/li&gt;
&lt;li&gt;contesto (da dove arriva, obiettivo)&lt;/li&gt;
&lt;li&gt;vincoli (cosa è consentito/non consentito)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Classi esplicite e finite
&lt;/h3&gt;

&lt;p&gt;Esempio: classificare un’email per dipartimento.&lt;/p&gt;

&lt;p&gt;Classi: &lt;code&gt;billing | technical | sales | other&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Più le classi sono:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;mutuamente esclusive&lt;/li&gt;
&lt;li&gt;ben definite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…più il modello performa.&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Criteri (la parte che molti saltano)
&lt;/h3&gt;

&lt;p&gt;I criteri sono “regole del gioco”. Anche una semplice booleana diventa affidabile quando definisci:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;quando è &lt;strong&gt;true&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;quando è &lt;strong&gt;false&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;cosa fare in caso di ambiguità&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In ottica UI, i criteri sono l’equivalente di una &lt;strong&gt;spec&lt;/strong&gt;: riducono interpretazioni creative.&lt;/p&gt;

&lt;h3&gt;
  
  
  4) Gestione confidenza
&lt;/h3&gt;

&lt;p&gt;Non trattare la scelta come “verità”, ma come segnale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;confidence &amp;gt; 0.9&lt;/code&gt; → automatico&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0.7–0.9&lt;/code&gt; → automatico ma log + retry&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;lt; 0.7&lt;/code&gt; → fallback (chiedi conferma, passa a un modello più potente, oppure esci)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Questo è esattamente il modo in cui progettiamo UI robuste con input incerti.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando NON usarli
&lt;/h2&gt;

&lt;p&gt;Non sono una bacchetta magica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;se ti serve spiegazione, creatività o contenuto lungo → meglio System 2&lt;/li&gt;
&lt;li&gt;se il task richiede ragionamento multi-step complesso → meglio un modello deliberativo (o un orchestratore)&lt;/li&gt;
&lt;li&gt;se le classi sono mal definite o cambiano spesso → rischi instabilità e drift&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L’approccio vincente spesso è ibrido:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System 2 per pianificare (pochi step)&lt;/li&gt;
&lt;li&gt;System 1 per eseguire micro-decisioni rapide e ripetute&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implicazione pratica per chi fa frontend
&lt;/h2&gt;

&lt;p&gt;Questi modelli rendono più realistico costruire:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;agenti UI che &lt;strong&gt;non bloccano&lt;/strong&gt; l’esperienza&lt;/li&gt;
&lt;li&gt;automazioni “sempre attive” a costo quasi nullo&lt;/li&gt;
&lt;li&gt;feature AI con &lt;strong&gt;contratti di output&lt;/strong&gt; (JSON) che si integrano bene con TypeScript&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sintesi
&lt;/h3&gt;

&lt;p&gt;I modelli “System 1” spostano l’AI dal regno del testo libero a quello delle &lt;strong&gt;decisioni strutturate&lt;/strong&gt;: meno magia, più ingegneria. Per il frontend è una buona notizia, perché il nostro lavoro migliora quando l’output è validabile, misurabile e integrabile nel loop stato→azione.&lt;/p&gt;

&lt;p&gt;La direzione è chiara: più agenti, più automazioni, più controlli locali. E quando la latenza scende a poche decine di millisecondi, l’AI smette di essere un pannello laterale e diventa parte della UI.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/modelli-system-1-decisioni-in-millisecondi-per-agenti-ui-e-automazioni-anche-in-" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/modelli-system-1-decisioni-in-millisecondi-per-agenti-ui-e-automazioni-anche-in-&lt;/a&gt;&lt;/p&gt;

</description>
      <category>modellidiclassificaz</category>
      <category>agentibrowser</category>
      <category>outputstrutturatojso</category>
      <category>openweightsinlocale</category>
    </item>
    <item>
      <title>Jev e l’idea radicale: togliere il linguaggio ai “LLM” per avere decisioni veloci, economiche e tipizzate</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Tue, 22 Sep 2026 11:14:48 +0000</pubDate>
      <link>https://dev.to/frontendfacile/jev-e-lidea-radicale-togliere-il-linguaggio-ai-llm-per-avere-decisioni-veloci-economiche-e-2d2l</link>
      <guid>https://dev.to/frontendfacile/jev-e-lidea-radicale-togliere-il-linguaggio-ai-llm-per-avere-decisioni-veloci-economiche-e-2d2l</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Dalla generazione di testo ai modelli “System 1”: output a schema garantito, costi minimi e un nuovo modo di integrare l’AI nelle app frontend.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Negli ultimi anni abbiamo imparato a convivere con un paradosso: i modelli generativi sono potentissimi, ma spesso sono &lt;em&gt;sproporzionati&lt;/em&gt; rispetto al problema che dobbiamo risolvere in un’app.&lt;/p&gt;

&lt;p&gt;Se ti serve una decisione secca — &lt;strong&gt;sì/no&lt;/strong&gt;, una scelta tra opzioni, un punteggio — chiamare un modello “chat” significa pagare (in latenza e in token) un motore progettato per parlare bene, argomentare, essere utile e… riempire il silenzio. E nel prodotto questo si traduce in tre problemi ricorrenti:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Verbosity&lt;/strong&gt;: output lunghi quando servirebbe una singola parola.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fragilità dell’output&lt;/strong&gt;: parsing di testo libero, JSON “quasi valido”, edge case infiniti.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Costo e latenza&lt;/strong&gt;: soprattutto quando la decisione è in hot path (moderazione live, UI reattive, realtime).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jev nasce esattamente come risposta a questo: non un modello che &lt;em&gt;parla&lt;/em&gt;, ma un modello che &lt;em&gt;decide&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  L’idea: eliminare il linguaggio dall’interfaccia
&lt;/h2&gt;

&lt;p&gt;Il punto non è che “l’AI non usa più token” (li usa), ma che &lt;strong&gt;non ti restituisce linguaggio naturale come prodotto finale&lt;/strong&gt;. L’interfaccia è pensata per ottenere uno di pochi tipi di output, sempre nello stesso formato.&lt;/p&gt;

&lt;p&gt;In pratica, la query non è una richiesta “aperta”, ma una domanda &lt;strong&gt;fortemente tipizzata&lt;/strong&gt;, con un risultato che deve rispettare una delle tre forme:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;choice&lt;/strong&gt;: una scelta tra opzioni predefinite&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;score&lt;/strong&gt;: un valore numerico (punteggio)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;null&lt;/strong&gt;: un esito booleano/di gating (pass/fail)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La promessa è ambiziosa: &lt;strong&gt;schema matching garantito&lt;/strong&gt;, niente JSON rotto, niente “spiegoni” inutili, niente output che richiede parsing creativo. Per chi costruisce front-end e prodotti, questo cambia la qualità dell’integrazione: l’AI diventa un componente che si comporta più come una funzione pura che come una chat.&lt;/p&gt;




&lt;h2&gt;
  
  
  “Type-safe AI”: perché interessa davvero a chi sviluppa UI
&lt;/h2&gt;

&lt;p&gt;Se fai frontend moderno, sai che “type safety” non è una mania estetica: è un modo per ridurre i bug e rendere l’evoluzione del codice meno rischiosa.&lt;/p&gt;

&lt;p&gt;Traslato sull’AI, vuol dire:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Contratto di output stabile&lt;/strong&gt;: l’app sa esattamente cosa aspettarsi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meno glue code&lt;/strong&gt;: meno validazioni, meno fallback, meno regex.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UI più affidabile&lt;/strong&gt;: se l’AI alimenta componenti (badge, status, gating, ranking), vuoi output prevedibile.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un esempio tipico è la moderazione: invece di chiedere “è consentito?” e ricevere un paragrafo, chiedi una decisione &lt;em&gt;null&lt;/em&gt; che blocca/consente. Oppure un &lt;em&gt;choice&lt;/em&gt; per assegnare una categoria tra poche (es. &lt;code&gt;safe | suspicious | block&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  System 1 vs System 2: decisioni rapide, non ragionamenti lunghi
&lt;/h2&gt;

&lt;p&gt;Il framing “System 1” (alla Kahneman) è utile perché chiarisce lo scopo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System 1&lt;/strong&gt;: veloce, istintivo, cheap → perfetto per decisioni frequenti e leggere.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System 2&lt;/strong&gt;: lento, deliberativo, costoso → utile quando devi spiegare, ragionare, pianificare.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nel prodotto spesso hai bisogno del primo tipo molto più spesso del secondo.&lt;/p&gt;

&lt;p&gt;Pensa a:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;classificare un input utente in tempo reale&lt;/li&gt;
&lt;li&gt;scegliere la prossima azione di un NPC&lt;/li&gt;
&lt;li&gt;decidere se mostrare un contenuto, bloccarlo o metterlo in review&lt;/li&gt;
&lt;li&gt;assegnare priorità a elementi in una lista&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sono tutte cose che non richiedono un saggio, ma un verdetto.&lt;/p&gt;




&lt;h2&gt;
  
  
  Output tipizzato ≠ output corretto
&lt;/h2&gt;

&lt;p&gt;Qui è importante non confondere &lt;em&gt;robustezza del formato&lt;/em&gt; con &lt;em&gt;verità del contenuto&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Avere uno schema garantito significa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;niente allucinazioni nella &lt;strong&gt;struttura&lt;/strong&gt; (niente campi inventati, niente formati imprevedibili)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ma non significa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;zero errori nel &lt;strong&gt;merito&lt;/strong&gt; (può classificare male)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In più, il comportamento può rimanere &lt;strong&gt;non deterministico&lt;/strong&gt;: stessa domanda, stesso contesto, risposta diversa in run diversi. Questo è normale in molti modelli probabilistici e va gestito a livello di prodotto.&lt;/p&gt;

&lt;h3&gt;
  
  
  La leva utile: confidenza calibrata
&lt;/h3&gt;

&lt;p&gt;Un aspetto interessante è l’idea di restituire sempre un numero di &lt;strong&gt;confidenza calibrata&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;La confidenza “da chat” spesso è cosmetica: il modello suona sicuro perché gli esseri umani preferiscono risposte sicure. Qui invece l’obiettivo è che un “60%” significhi davvero: &lt;em&gt;in media, quando dico 60%, ho ragione circa 60 volte su 100&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Per un prodotto è oro, perché abilita pattern come:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;soglie&lt;/strong&gt; (es. accetta solo se confidenza &amp;gt; 0.85)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;fallback&lt;/strong&gt; (se confidenza bassa, passa a un modello più costoso, o a revisione umana)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UX adattiva&lt;/strong&gt; (mostra “verificato” solo sopra una certa soglia)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Casi d’uso che diventano più pratici (anche nel frontend)
&lt;/h2&gt;

&lt;p&gt;Se prendi sul serio un motore decisionale economico e veloce, si sbloccano integrazioni che prima evitavi per costo/latency:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Moderazione e policy enforcement&lt;/strong&gt; in linea (prima del submit o al momento della pubblicazione).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Filtri intelligenti&lt;/strong&gt; in UI (ranking, sorting, dedupe) guidati da score.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Routing di richieste&lt;/strong&gt;: decidere quale pipeline usare (cheap vs premium).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Realtime&lt;/strong&gt;: giochi, simulazioni, strumenti interattivi (decisioni per frame/tick o quasi).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nel frontend, la differenza è che puoi trattare l’AI come un servizio che risponde con un tipo semplice, integrabile in stato e componenti senza dover “domare” testo libero.&lt;/p&gt;




&lt;h2&gt;
  
  
  Il punto controverso: quanto è nuovo rispetto ai classifier zero-shot?
&lt;/h2&gt;

&lt;p&gt;L’idea di usare modelli per classificazione zero-shot non è nuova: da anni si estraggono probabilità su etichette/candidati e si sceglie l’opzione migliore.&lt;/p&gt;

&lt;p&gt;Il salto (se confermato) sta più nell’insieme di scelte di prodotto e training:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;interfaccia tipizzata (choice/score/null)&lt;/li&gt;
&lt;li&gt;promessa di schema invariabile&lt;/li&gt;
&lt;li&gt;confidenza calibrata come feature di prima classe&lt;/li&gt;
&lt;li&gt;ottimizzazione aggressiva su costi e latenza&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;È anche il motivo per cui stanno comparendo implementazioni alternative che riproducono un’interfaccia simile leggendo le probabilità delle opzioni da modelli esistenti, in un singolo forward pass. Per chi sviluppa, questa dinamica è interessante perché suggerisce che &lt;strong&gt;il pattern&lt;/strong&gt; potrebbe diffondersi anche oltre un singolo fornitore.&lt;/p&gt;




&lt;h2&gt;
  
  
  Implicazione pratica: progettare l’AI come “componente tipizzato”
&lt;/h2&gt;

&lt;p&gt;Se costruisci prodotti web, la lezione più utile non è il nome del modello, ma il cambio di mentalità:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quando ti serve &lt;em&gt;generazione&lt;/em&gt;, usa un generatore.&lt;/li&gt;
&lt;li&gt;Quando ti serve &lt;em&gt;decisione&lt;/em&gt;, progetta un contratto tipizzato e chiedi solo quello.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In concreto:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Definisci poche opzioni chiare (choice) invece di domande aperte.&lt;/li&gt;
&lt;li&gt;Introduci un punteggio (score) quando serve ranking, non spiegazioni.&lt;/li&gt;
&lt;li&gt;Usa null/boolean per gating e policy.&lt;/li&gt;
&lt;li&gt;Progetta soglie di confidenza e fallback fin dall’inizio.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sintesi
&lt;/h3&gt;

&lt;p&gt;Il futuro “pratico” dell’AI nelle app non passa solo da modelli sempre più bravi a parlare, ma da modelli e interfacce pensate per &lt;strong&gt;rispondere in modo controllabile&lt;/strong&gt;. Tipi, schemi e confidenza calibrata portano l’AI più vicino a ciò che il software ha sempre preteso: contratti affidabili. E quando il contratto è chiaro, l’integrazione smette di essere una demo e diventa davvero prodotto.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/jev-e-l-idea-radicale-togliere-il-linguaggio-ai-llm-per-avere-decisioni-veloci-e" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/jev-e-l-idea-radicale-togliere-il-linguaggio-ai-llm-per-avere-decisioni-veloci-e&lt;/a&gt;&lt;/p&gt;

</description>
      <category>modellitipizzati</category>
      <category>classificazionezeros</category>
      <category>validazioneschema</category>
      <category>confidenzacalibrata</category>
    </item>
    <item>
      <title>Harness engineering: come sono evoluti i “trucchi” che fanno funzionare davvero gli agenti</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Tue, 22 Sep 2026 11:09:48 +0000</pubDate>
      <link>https://dev.to/frontendfacile/harness-engineering-come-sono-evoluti-i-trucchi-che-fanno-funzionare-davvero-gli-agenti-52he</link>
      <guid>https://dev.to/frontendfacile/harness-engineering-come-sono-evoluti-i-trucchi-che-fanno-funzionare-davvero-gli-agenti-52he</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Dal prompt singolo ai grafi di lavoro, fino a sistemi che ottimizzano se stessi: una mappa pratica delle idee che stanno ridisegnando l’infrastruttura tra modello e mondo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Costruire agenti AI non significa “scrivere un prompt migliore”. Significa progettare un &lt;em&gt;harness&lt;/em&gt;: tutto ciò che si frappone tra il mondo reale (utenti, file, API, database, UI, policy) e il modello (inferenzia, genera token, chiama strumenti). L’harness è l’ingegneria che rende l’AI &lt;em&gt;operativa&lt;/em&gt;: affidabile, veloce, controllabile, integrabile.&lt;/p&gt;

&lt;p&gt;Negli ultimi anni abbiamo visto una progressione chiara: ogni volta che il solo testo non bastava, abbiamo aggiunto struttura attorno al modello. E ogni volta che quella struttura diventava troppo complessa, abbiamo trovato un modo per farla “mangiare” al modello, oppure per delegare al modello la sua stessa ottimizzazione.&lt;/p&gt;

&lt;p&gt;Qui metto in fila i passaggi più utili da capire — non come cronologia da museo, ma come cassetta degli attrezzi per chi costruisce prodotti agentici.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cos’è un harness (in pratica)
&lt;/h2&gt;

&lt;p&gt;Un harness è &lt;strong&gt;tutto ciò che sta tra “il mondo” e “il modello”&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prompt di sistema e istruzioni&lt;/li&gt;
&lt;li&gt;esempi few-shot / template&lt;/li&gt;
&lt;li&gt;orchestrazione (catene, loop, grafi)&lt;/li&gt;
&lt;li&gt;tool calling, sandbox, permessi&lt;/li&gt;
&lt;li&gt;parser, validatori, schemi&lt;/li&gt;
&lt;li&gt;memoria (short/long-term), retrieval&lt;/li&gt;
&lt;li&gt;policy, guardrail, auditing&lt;/li&gt;
&lt;li&gt;telemetria, metriche, valutazioni&lt;/li&gt;
&lt;li&gt;persino parti del decoding e dell’inference pipeline, quando vengono usate per vincolare l’output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se un agente in produzione “automatta mezza azienda”, non è magia: è harness engineering fatto bene.&lt;/p&gt;




&lt;h2&gt;
  
  
  1) Dal few-shot alla “programmazione” via prompt
&lt;/h2&gt;

&lt;p&gt;All’inizio i modelli non “seguivano istruzioni”: completavano testo. Il primo hack funzionale è stato &lt;strong&gt;rendere l’output desiderato il più probabile possibile&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Few-shot: esempi come priming
&lt;/h3&gt;

&lt;p&gt;Mettere esempi &lt;em&gt;prima&lt;/em&gt; del task serve a impostare lo stato latente: il modello riconosce pattern e li continua.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zero-shot: istruzione diretta
&lt;/h3&gt;

&lt;p&gt;A un certo punto si è capito che, spesso, &lt;strong&gt;un’istruzione ben scritta&lt;/strong&gt; può portare a uno stato interno simile agli esempi. Nasce l’idea di &lt;em&gt;prompt programming&lt;/em&gt;: non solo “chiedere”, ma progettare un input per ottenere una distribuzione di output più utile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implicazione pratica:&lt;/strong&gt; prima di introdurre tool e framework, verifica se il comportamento desiderato è ottenibile con una sola variazione di framing. È la leva a costo più basso.&lt;/p&gt;




&lt;h2&gt;
  
  
  2) Catene: quando un prompt non basta
&lt;/h2&gt;

&lt;p&gt;Quando il lavoro diventa composto (ricerca → sintesi → trasformazione → verifica), un singolo passaggio degrada.&lt;/p&gt;

&lt;p&gt;La risposta è stata &lt;strong&gt;spezzare il compito in più prompt&lt;/strong&gt;: le &lt;em&gt;chains&lt;/em&gt;. Non è solo “più chiamate”, è progettare &lt;em&gt;passaggi con output intermedi&lt;/em&gt; che riducono ambiguità e aumentano controllabilità.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implicazione pratica:&lt;/strong&gt; catene = debuggabilità. Se non riesci a spiegare perché un agente fallisce, spesso è perché stai chiedendo troppo in un passo solo.&lt;/p&gt;




&lt;h2&gt;
  
  
  3) Loop: ReAct e il lavoro con side effect
&lt;/h2&gt;

&lt;p&gt;Con l’arrivo degli agenti “che fanno cose”, il testo non è più innocuo: produce azioni che cambiano lo stato del mondo.&lt;/p&gt;

&lt;p&gt;Il pattern base diventa un loop:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;osservazione (stato, output tool)&lt;/li&gt;
&lt;li&gt;ragionamento (piano/decisione)&lt;/li&gt;
&lt;li&gt;azione (tool call)&lt;/li&gt;
&lt;li&gt;nuova osservazione&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Questo è il cuore di gran parte degli agenti moderni: l’harness non genera solo testo, ma gestisce un ciclo di interazione con l’ambiente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implicazione pratica:&lt;/strong&gt; se un agente è instabile, spesso non è “colpa del modello”, ma di un loop progettato male: osservazioni incomplete, azioni troppo potenti, mancanza di controlli o di criteri di stop.&lt;/p&gt;




&lt;h2&gt;
  
  
  4) Aumentare le dimensioni: dall’albero al “best path”
&lt;/h2&gt;

&lt;p&gt;Dopo catene e loop, la naturale estensione è esplorare più alternative.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tree of Thoughts (e varianti)
&lt;/h3&gt;

&lt;p&gt;Invece di un’unica traiettoria, si generano più rami, si valuta e si sceglie.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pro: più probabilità di trovare una soluzione corretta&lt;/li&gt;
&lt;li&gt;Contro: costi di inference più alti (token, tool calls, tempo)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Implicazione pratica:&lt;/strong&gt; utile quando il costo dell’errore è alto (migrazioni, refactor complessi, query delicate), meno quando serve latenza bassa.&lt;/p&gt;




&lt;h2&gt;
  
  
  5) Output affidabile: dal “premio in JSON” ai vincoli nel decoding
&lt;/h2&gt;

&lt;p&gt;Molti team hanno provato a ottenere JSON valido promettendo ricompense testuali o minacciando retry. Funziona… finché non funziona.&lt;/p&gt;

&lt;p&gt;Un salto di qualità arriva quando sposti l’affidabilità &lt;strong&gt;dalle parole alle regole&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;parsing strutturato&lt;/li&gt;
&lt;li&gt;schema validation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;grammar-constrained decoding&lt;/strong&gt;: il decoder ammette solo token compatibili con una grammatica&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qui l’inference pipeline diventa parte del harness: non “speri” nel formato, lo imponi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implicazione pratica:&lt;/strong&gt; se l’output alimenta sistemi downstream (UI, DB, workflow), vincolare il decoding è spesso più efficace di qualsiasi prompt.&lt;/p&gt;




&lt;h2&gt;
  
  
  6) Prompt che ottimizzano prompt: hill climbing sul linguaggio
&lt;/h2&gt;

&lt;p&gt;Un’altra svolta è usare i modelli per esplorare lo spazio dei prompt e migliorare una metrica.&lt;/p&gt;

&lt;p&gt;L’idea è semplice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;definisci un obiettivo misurabile&lt;/li&gt;
&lt;li&gt;generi varianti di prompt&lt;/li&gt;
&lt;li&gt;valuti&lt;/li&gt;
&lt;li&gt;tieni i migliori e iteri&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sembra banale, ma cambia la mentalità: non cerchi “il prompt giusto”, costruisci una &lt;strong&gt;procedura di ottimizzazione&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implicazione pratica:&lt;/strong&gt; appena hai una metrica affidabile (accuracy, pass rate, human rating, cost/latency), ha senso trasformare il prompting in un ciclo sperimentale ripetibile.&lt;/p&gt;




&lt;h2&gt;
  
  
  7) Sampling massivo e selezione: qualità via quantità
&lt;/h2&gt;

&lt;p&gt;Un pattern sempre più comune: generare molte soluzioni e selezionare le migliori.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ripeti la generazione N volte&lt;/li&gt;
&lt;li&gt;valuti con rubriche, test, esecuzione, self-check&lt;/li&gt;
&lt;li&gt;scegli la traiettoria migliore&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;È un modo pragmatico per ottenere qualità senza aspettare “il modello perfetto”. Ed è anche un ponte verso sistemi che migliorano col tempo, perché le traiettorie migliori diventano dati preziosi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implicazione pratica:&lt;/strong&gt; per codegen, l’accoppiata “molte candidate + test automatici” spesso batte qualunque prompt sofisticato.&lt;/p&gt;




&lt;h2&gt;
  
  
  8) Oltre la context window: spezzare il lavoro su più finestre
&lt;/h2&gt;

&lt;p&gt;Quando i task superano i limiti del contesto, smetti di comprimere tutto in un prompt.&lt;/p&gt;

&lt;p&gt;La strategia efficace è distribuire:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;segmenti di lavoro in finestre separate&lt;/li&gt;
&lt;li&gt;contesti “freschi” per ciascun segmento&lt;/li&gt;
&lt;li&gt;consolidamento finale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In pratica: invece di forzare il modello in condizioni peggiori di quelle per cui è ottimizzato, lo riporti in una zona “nativa”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implicazione pratica:&lt;/strong&gt; per analisi di codebase grandi, è spesso meglio pianificare una pipeline di chunking + subtask + merge, anziché aumentare il contesto e sperare.&lt;/p&gt;




&lt;h2&gt;
  
  
  9) Il modello “mangia” il harness: agenti che si costruiscono gli strumenti
&lt;/h2&gt;

&lt;p&gt;Un cambio di paradigma: invece di progettare un harness enorme, parti minimale e lasci che il modello lo estenda.&lt;/p&gt;

&lt;p&gt;Esempio tipico:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pochi tool fondamentali (es. eseguire comandi, leggere/scrivere file)&lt;/li&gt;
&lt;li&gt;il modello decide come combinare, creare wrapper, definire routine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Qui sfrutti un fatto scomodo ma vero: i modelli hanno assorbito moltissima conoscenza su tool, pattern di orchestrazione e “come ci si aspetta che funzioni un agente”, perché questi pattern compaiono ovunque nei dati.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implicazione pratica:&lt;/strong&gt; riduci configurazione manuale e boilerplate, ma aumenta la necessità di &lt;em&gt;policy, permessi, sandbox&lt;/em&gt; e osservabilità. Un agente che si auto-estende è potente e pericoloso se non lo contieni.&lt;/p&gt;




&lt;h2&gt;
  
  
  10) Prestazioni: eseguire codice mentre i token arrivano
&lt;/h2&gt;

&lt;p&gt;Quando l’AI diventa commodity, la latenza diventa intollerabile: nessuno aspetta decine di secondi per il primo risultato.&lt;/p&gt;

&lt;p&gt;Un hack interessante è &lt;strong&gt;speculative tool execution&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;il modello inizia a generare una chiamata a tool / funzione&lt;/li&gt;
&lt;li&gt;appena è sintatticamente valida, la esegui subito&lt;/li&gt;
&lt;li&gt;quando il modello termina, hai già risultati pronti da reiniettare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Invece di aspettare token, sfrutti che l’esecuzione di funzioni può essere più veloce e parallelizzabile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implicazione pratica:&lt;/strong&gt; se la tua UX soffre sul “time-to-first-useful-result”, valuta strategie speculative soprattutto su tool deterministicamente sicuri (letture, calcoli, query con limiti rigidi).&lt;/p&gt;




&lt;h1&gt;
  
  
  Tre traiettorie per capire cosa sta succedendo (e cosa progettare)
&lt;/h1&gt;

&lt;p&gt;Guardando questi hack, emergono tre direzioni ricorrenti.&lt;/p&gt;

&lt;h2&gt;
  
  
  A) La forma del lavoro: testo → catena → loop → albero → grafo
&lt;/h2&gt;

&lt;p&gt;La prossima forma naturale non è “più catene”, ma &lt;strong&gt;grafi di lavoro&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fan-out / fan-in&lt;/li&gt;
&lt;li&gt;parallelismo&lt;/li&gt;
&lt;li&gt;join e barriere&lt;/li&gt;
&lt;li&gt;branch condizionali&lt;/li&gt;
&lt;li&gt;retry mirati&lt;/li&gt;
&lt;li&gt;dipendenze esplicite tra risultati intermedi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un grafo può contenere catene e loop come casi particolari, ma offre un modello mentale più adatto al lavoro reale.&lt;/p&gt;

&lt;h2&gt;
  
  
  B) Il modello assorbe il harness
&lt;/h2&gt;

&lt;p&gt;Sempre più spesso:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;servono meno istruzioni fisse&lt;/li&gt;
&lt;li&gt;servono più &lt;em&gt;contratti&lt;/em&gt; (schema, policy, vincoli)&lt;/li&gt;
&lt;li&gt;il modello può proporre (o scegliere) la strategia di esecuzione&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In altre parole: meno “prompt lunghi”, più “sistemi che valutano e vincolano”.&lt;/p&gt;

&lt;h2&gt;
  
  
  C) La scala cresce: da una call a una “città di esperti”
&lt;/h2&gt;

&lt;p&gt;Sampling, sub-agent, parallelismo, grafi: la tendenza è amplificare la capacità tramite &lt;strong&gt;molte istanze coordinate&lt;/strong&gt;, non solo tramite un modello più grande.&lt;/p&gt;




&lt;h2&gt;
  
  
  Cosa significa per chi costruisce prodotti (frontend e non solo)
&lt;/h2&gt;

&lt;p&gt;Se stai integrando agenti in strumenti reali (IDE, ticketing, Slack/Teams, dashboard interne), le implicazioni pratiche sono abbastanza nette:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tratta il prompting come UI/UX del ragionamento&lt;/strong&gt;, ma non come unica leva.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metti struttura dove serve affidabilità&lt;/strong&gt;: schema, parsing, vincoli nel decoding.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preferisci grafi a catene monolitiche&lt;/strong&gt; quando il task ha dipendenze e parallelismo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progetta metriche e telemetria&lt;/strong&gt;: senza segnali chiari, non ottimizzi nulla; “hill climbing” richiede feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contieni la potenza&lt;/strong&gt;: sandbox, permessi, rate limit, audit. Più l’agente è autonomo, più l’harness deve essere robusto.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Sintesi finale
&lt;/h2&gt;

&lt;p&gt;L’harness engineering è l’arte di trasformare un generatore di testo in un sistema che lavora: osserva, decide, agisce, verifica e migliora. La storia recente mostra un pattern ripetibile: quando un approccio si satura (prompt), aggiungiamo struttura (catene/loop/grafi), poi rendiamo quella struttura ottimizzabile (hill climb), e infine deleghiamo parte della progettazione al modello stesso — mantenendo però vincoli e metriche sempre più rigorosi.&lt;/p&gt;

&lt;p&gt;Se c’è una regola pratica che vale oggi: &lt;strong&gt;meno fiducia cieca nell’output, più ingegneria attorno al processo&lt;/strong&gt;. È lì che gli agenti diventano prodotti.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/harness-engineering-come-sono-evoluti-i-trucchi-che-fanno-funzionare-davvero-gli" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/harness-engineering-come-sono-evoluti-i-trucchi-che-fanno-funzionare-davvero-gli&lt;/a&gt;&lt;/p&gt;

</description>
      <category>harnessengineering</category>
      <category>agentillm</category>
      <category>toolcalling</category>
      <category>orchestrazionegrafi</category>
    </item>
    <item>
      <title>Agentic engineering in un contesto bancario: disciplina, repo come fonte di verità e “review del piano”</title>
      <dc:creator>frontendfacile.it</dc:creator>
      <pubDate>Tue, 22 Sep 2026 11:04:47 +0000</pubDate>
      <link>https://dev.to/frontendfacile/agentic-engineering-in-un-contesto-bancario-disciplina-repo-come-fonte-di-verita-e-review-del-1l45</link>
      <guid>https://dev.to/frontendfacile/agentic-engineering-in-un-contesto-bancario-disciplina-repo-come-fonte-di-verita-e-review-del-1l45</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Come progettare un flusso di lavoro che sfrutti gli agenti senza perdere controllo, qualità e tracciabilità (soprattutto quando audit e compliance non sono opzionali).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Costruire prodotti digitali in ambito fintech è un esercizio di equilibrio: da una parte la necessità di muoversi velocemente, dall’altra l’obbligo di spiegare e documentare &lt;em&gt;perché&lt;/em&gt; una funzionalità esiste, &lt;em&gt;come&lt;/em&gt; è stata progettata e &lt;em&gt;chi&lt;/em&gt; se ne assume la responsabilità.&lt;/p&gt;

&lt;p&gt;Quando aggiungi agenti AI al mix, la tentazione è trattarli come un acceleratore di codice. Ma se il tuo dominio è regolato (banking, assicurazioni, healthcare), l’acceleratore da solo non basta: serve un sistema operativo del prodotto che mantenga disciplina, auditabilità e qualità.&lt;/p&gt;

&lt;p&gt;Di seguito raccolgo un modello pratico per rendere l’agentic engineering “adatto alla produzione” senza trasformarlo in caos: repo come fonte di verità, specifiche e piani in chiaro, e un’idea semplice ma potente—&lt;strong&gt;non rendere deterministico l’agente, rendi disciplinato il processo&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Determinismo vs disciplina: l’obiettivo non è “controllare l’AI”, è controllare il flusso
&lt;/h2&gt;

&lt;p&gt;Nella vita reale neanche gli esseri umani sono davvero deterministici: due persone che implementano la stessa feature difficilmente produrranno lo stesso identico codice. Il punto, quindi, non è pretendere output identici, ma costruire un &lt;strong&gt;processo affidabile&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;“Affidabile” in questo contesto significa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;specifiche chiare e verificabili&lt;/li&gt;
&lt;li&gt;decisioni tracciate&lt;/li&gt;
&lt;li&gt;cambiamenti piccoli e revisionabili&lt;/li&gt;
&lt;li&gt;controlli automatici e manuali nei punti giusti&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se il processo è solido, l’agente diventa un moltiplicatore. Se il processo è fragile, l’agente amplifica solo l’entropia.&lt;/p&gt;




&lt;h2&gt;
  
  
  Il problema classico: BRD giganteschi e responsabilità diffuse
&lt;/h2&gt;

&lt;p&gt;Molte organizzazioni partono da un flusso simile:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;esiste un problema di business&lt;/li&gt;
&lt;li&gt;viene prodotto un documento (spesso enorme)&lt;/li&gt;
&lt;li&gt;qualcuno lo “traduce” in requisiti di prodotto&lt;/li&gt;
&lt;li&gt;i team ingegneristici devono dedurre acceptance criteria, edge case e implementazione&lt;/li&gt;
&lt;li&gt;si rilascia, si corregge, si reitera&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Questo ciclo funziona finché la complessità è gestibile. In un dominio regolato, però, si aggiunge un vincolo duro: &lt;strong&gt;devi poter ricostruire le decisioni&lt;/strong&gt;. Non solo &lt;em&gt;cosa&lt;/em&gt; hai fatto, ma &lt;em&gt;perché&lt;/em&gt; lo hai fatto in quel modo.&lt;/p&gt;




&lt;h2&gt;
  
  
  Spostare il baricentro: il repository come “single source of truth”
&lt;/h2&gt;

&lt;p&gt;Un passaggio chiave è decidere &lt;em&gt;dove vive la verità operativa&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Documentazione e strumenti rimangono utili (wiki, tool di design, issue tracker), ma per rendere davvero produttivi team e agenti serve un punto centrale, versionato e vicino al codice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scelta pragmatica:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;le specifiche e i piani di implementazione vivono nel repository&lt;/li&gt;
&lt;li&gt;possono essere issue strutturate o file Markdown (ADR, RFC, spec)&lt;/li&gt;
&lt;li&gt;ogni decisione rilevante rimane collegata a commit, PR e release&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In un contesto di audit, questo cambia le regole del gioco: quando arriva una domanda scomoda (“perché questa logica calcola X così?”), hai una catena di evidenze più corta e più robusta.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ruoli più fluidi, ma responsabilità più chiare
&lt;/h2&gt;

&lt;p&gt;Un effetto collaterale interessante dell’adozione di agenti è che “i confini” tra funzioni tendono ad ammorbidirsi.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Product&lt;/strong&gt; resta owner del &lt;em&gt;problema&lt;/em&gt;: persona, obiettivo, vincoli, priorità.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design&lt;/strong&gt; resta owner della &lt;em&gt;soluzione UX/UI&lt;/em&gt;, ma può aprire il processo: far sperimentare altri membri del team sui flussi, dentro un design system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Engineering&lt;/strong&gt; non è solo esecuzione: deve garantire confini, invarianti, architettura, qualità operativa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gli agenti aiutano a generare varianti, scenari, edge case, alternative. Ma la proprietà del risultato deve restare umana.&lt;/p&gt;

&lt;p&gt;Qui vale una regola semplice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Gusto, accountability e ownership restano sul lato umano.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Il resto—boilerplate, typing, refactoring ripetitivo—si può delegare con più serenità.&lt;/p&gt;




&lt;h2&gt;
  
  
  “Review del piano” invece di “review del mega-PR”
&lt;/h2&gt;

&lt;p&gt;Uno dei punti più concreti è cambiare cosa si revisiona.&lt;/p&gt;

&lt;p&gt;In ambienti dove la review è obbligatoria (e spesso lo è), il rischio è finire con PR ingestibili: decine di file, migliaia di righe, scarsa comprensione, alta probabilità di errori.&lt;/p&gt;

&lt;p&gt;Un approccio più sostenibile è:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Specifiche approvate&lt;/strong&gt; (incluse le funzioni di controllo: compliance, risk, security quando serve)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Piano di implementazione dettagliato&lt;/strong&gt;, grande quanto basta per essere utile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Task piccoli&lt;/strong&gt;, abbastanza granulari da essere:

&lt;ul&gt;
&lt;li&gt;prodotti dall’agente&lt;/li&gt;
&lt;li&gt;revisionati da umani e/o agenti&lt;/li&gt;
&lt;li&gt;testati e rilasciati in modo incrementale&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Il risultato è una review che valuta prima la traiettoria (piano), poi l’esecuzione (task). E questa è una differenza enorme quando vuoi velocità senza perdere governance.&lt;/p&gt;




&lt;h2&gt;
  
  
  Dove mettere gli umani: security, privacy e confini del rischio
&lt;/h2&gt;

&lt;p&gt;Se vuoi usare agenti in produzione, la domanda “dove metto l’intervento umano?” deve avere una risposta esplicita.&lt;/p&gt;

&lt;p&gt;Una divisione efficace è:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agenti&lt;/strong&gt; su parti a basso rischio e ad alto volume (es. wiring, UI ripetitiva, mapping, refactor meccanici)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Umani&lt;/strong&gt; su:

&lt;ul&gt;
&lt;li&gt;GDPR e trattamento dati&lt;/li&gt;
&lt;li&gt;security e compliance&lt;/li&gt;
&lt;li&gt;remediation da penetration test&lt;/li&gt;
&lt;li&gt;autorizzazioni, token, sessioni, confini di trust&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Non perché l’agente “non sia capace”, ma perché &lt;strong&gt;in quei punti la responsabilità è indelegabile&lt;/strong&gt; e la dimostrazione di controllo deve essere semplice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Un modello a strati per ridurre il rischio (senza fermare la delivery)
&lt;/h2&gt;

&lt;p&gt;Invece di discutere in modo astratto se “l’AI è sicura”, conviene strutturare una pipeline di verifiche. Un esempio realistico:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Spec umana&lt;/strong&gt; (con vincoli e acceptance criteria)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static checks e test&lt;/strong&gt; (lint, typecheck, unit test)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic checks&lt;/strong&gt; (integrazione, end-to-end, security test/DAST)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review dell’agente&lt;/strong&gt; (per coerenza e regressioni evidenti)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review umana mirata&lt;/strong&gt; (punti critici)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release management&lt;/strong&gt; con gate finale&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Questo non è “burocrazia”: è una forma di &lt;em&gt;risk budgeting&lt;/em&gt;. Automatizzi tutto ciò che può essere automatizzato, e conservi energie umane dove hanno impatto.&lt;/p&gt;




&lt;h2&gt;
  
  
  Seniority dopo gli agenti: non è (più) “sapere il framework a memoria”
&lt;/h2&gt;

&lt;p&gt;L’arrivo degli agenti mette pressione su una definizione di seniority troppo legata al dettaglio sintattico.&lt;/p&gt;

&lt;p&gt;Se il tuo valore è “conosco React Native a memoria”, il giorno in cui l’agente scrive quel codice meglio e più in fretta, ti senti spiazzato.&lt;/p&gt;

&lt;p&gt;Ma la seniority vera inizia dove l’agente fatica:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ragionare per invarianti e confini&lt;/li&gt;
&lt;li&gt;fare system design e threat modeling&lt;/li&gt;
&lt;li&gt;capire perché una scelta è giusta per &lt;em&gt;quel&lt;/em&gt; dominio&lt;/li&gt;
&lt;li&gt;orchestrare il lavoro (umani + agenti)&lt;/li&gt;
&lt;li&gt;alzare la qualità del team: mentoring, review, cultura operativa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In pratica: meno “abilità di digitazione”, più &lt;strong&gt;capacità di guidare sistemi&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Il rischio reale: la “cognitive surrender”
&lt;/h2&gt;

&lt;p&gt;Il nemico non è l’AI. È la resa cognitiva: copiare/incollare output senza validazione, perché “sembra giusto”.&lt;/p&gt;

&lt;p&gt;Questo atteggiamento esisteva già (ricette trovate online, snippet non compresi), ma gli agenti lo rendono più pericoloso perché l’output è più convincente.&lt;/p&gt;

&lt;p&gt;L’antidoto è culturale e processuale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;chiedere sempre &lt;strong&gt;prove&lt;/strong&gt; (test, metriche, reasoning, trade-off)&lt;/li&gt;
&lt;li&gt;rendere obbligatorio il collegamento tra spec → piano → task → PR&lt;/li&gt;
&lt;li&gt;misurare la qualità (defect rate, lead time, rollback) invece di misurare “righe prodotte”&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Sintesi: agenti sì, ma dentro un sistema che regge
&lt;/h2&gt;

&lt;p&gt;Un’adozione efficace dell’agentic engineering non parte dal prompt perfetto: parte dal &lt;strong&gt;modello operativo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Se vuoi portare questo approccio nel tuo team già da domani, l’implicazione pratica è chiara:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sposta specifiche e piani nel repository&lt;/li&gt;
&lt;li&gt;rendi piccole le unità di cambiamento&lt;/li&gt;
&lt;li&gt;revisiona il piano prima del codice&lt;/li&gt;
&lt;li&gt;automatizza i controlli, ma mantieni umani sui punti di rischio&lt;/li&gt;
&lt;li&gt;ridefinisci la seniority come capacità di design, governance e responsabilità&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gli agenti possono aumentare la velocità. La disciplina aumenta l’affidabilità. In un prodotto reale—e soprattutto in un dominio regolato—servono entrambe.&lt;/p&gt;




&lt;p&gt;Articolo originale: &lt;a href="https://frontendfacile.it/blog/agentic-engineering-in-un-contesto-bancario-disciplina-repo-come-fonte-di-verita" rel="noopener noreferrer"&gt;https://frontendfacile.it/blog/agentic-engineering-in-un-contesto-bancario-disciplina-repo-come-fonte-di-verita&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agenticengineering</category>
      <category>singlesourceoftruth</category>
      <category>reviewdelpiano</category>
      <category>processodisviluppo</category>
    </item>
  </channel>
</rss>
