./run agenzia-ai-wordpress-divi5-9-agenti
22 minuti per un sito WordPress, due giorni per non farlo sembrare brutto
Diario tecnico di un'agenzia web a 9 agenti Claude: dal brief al sito Divi 5 live in ~22 minuti su k8s bare-metal. La lezione: automatizzare la plumbing è facile, non farla sembrare brutta no.
- status
- draft
- project
- wordpress-lab
- updated
- 2026-07-07
- tags
Volevo scoprire una cosa sola: quanto lontano si può spingere un’agenzia web fatta interamente di agenti. Non un copilota che suggerisce, ma una catena che prende un brief JSON e sputa fuori un sito WordPress vero, con pagine Divi 5, contenuti, SEO e deploy. La risposta tecnica mi ha sorpreso in fretta: ~22 minuti netti dal brief alle 5 pagine live. Poi ho guardato il sito e mi sono ricordato perché le agenzie esistono ancora. Faceva schifo.
Questo è il diario di quella seconda parte — quella che nessuno racconta perché non fa demo.
L’idea: un’agenzia che è una pipeline
Il concept è brutale nella sua linearità. Nove agenti in sequenza, ognuno un file (uno script bash + un prompt Markdown), ognuno che scrive un artefatto JSON che il successivo legge:
brief.json
1. Briefing → requirements.json
2. UX/IA → sitemap.json + page-architecture.json
3. Design → {slug}.divi5.json + pagine WP create
4. Content → {slug}.content.json
5. Image → {slug}.images.json
6. Injector → injection-report.json (solo REST, niente LLM)
7. SEO → {slug}.seo.json
8. QA → report.json (verdetto pass/fail)
[ APPROVAZIONE UMANA ]
9. Deploy → deployment-log.json
Sotto c’è un cluster Kubernetes self-hosted (8 nodi bare-metal, Traefik, Rook-Ceph, cert-manager con Let’s Encrypt) e un namespace wordpress-lab isolato: MariaDB, Redis, e un WordPress su immagine Wodby con sidecar nginx. Ogni sito nasce lì, in draft, e viene promosso solo dopo validazione. Il ponte con WordPress è Respira, un plugin MCP: 172 tool mappati, di cui una trentina critici. Il Design Agent non “clicca” in una dashboard — fa una POST a /wp-json/respira/v2/builder/build con header X-Respira-API-Key e riceve una pagina Divi 5 costruita a blocchi.
Gli agenti stessi sono volutamente stupidi: nessun framework, dual-API per non dipendere da niente.
MODEL="claude-sonnet-4"
if command -v anthropic &>/dev/null; then
RESPONSE=$(anthropic messages create --model "$MODEL" ...)
else
RESPONSE=$(curl -s -X POST "https://api.anthropic.com/v1/messages" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" ...)
fi
Il primo giro: la plumbing funziona, e non è quello il problema
Il primo end-to-end su un brand di esempio (5 pagine, 23 sezioni, 77 moduli) ha prodotto i classici 7 bug d’integrazione che emergono solo nella corsa completa. Nessuno era interessante di per sé, ma insieme raccontano la verità sulle pipeline di agenti:
- JSON troncato a 16K token. L’architettura di 5 pagine pesa ~75K caratteri:
MAX_TOKENSa 16000 tagliava una stringa a metà. Alzato a 32000. Un minuto di fix. - stdout che contamina la risposta API. I log andavano su stdout e finivano dentro il JSON che l’agente successivo parsava. Redirect di tutto su stderr.
- QA che usciva con
exit 1sul verdetto “fail”. L’orchestratore trattava l’agente come crashato, ma il QA aveva fatto il suo lavoro: il report esisteva. Il gate di approvazione gestisce le issue critiche, non l’exit code. imagesvsimage. L’array agenti dicevaimages, lo script si chiamavaimage-agent.sh. L’orchestratore non lo trovava e cadeva sul placeholder. Due minuti.
Totale: ~22 minuti di lavoro netto, ~42 con tutti i fix. Tutti risolti in minuti. Sono bug di idraulica, e l’idraulica si aggiusta. Il verdetto sul risultato, invece, è stato una parola sola dall’unico giudice che conta: “minimale e inadeguato”.
La spina: la parte difficile non è nessuno dei 9 agenti
Ecco la lezione controintuitiva del progetto. La pipeline era completa, veloce, robusta. E produceva pagine brutte. Non rotte: brutte. Spacing insufficiente, tipografia senza gerarchia, colori spiattellati come sfondo, layout a colonna singola ripetuti. Ho misurato il danno: il Design Agent usava circa il 5% delle capacità di styling di Divi 5. Generava struttura, non design.
Il problema è che “bello” non è un bug con uno stack trace. Non puoi fixarlo con un redirect. L’ho affrontato come si affronta un dominio, non un errore: ho costruito un design system come reference vincolante (~1400 righe: scale di spacing, tipografia, ombre, raggi, 9 ricette JSON complete per tipo di sezione) e ho riscritto il prompt del Design Agent da 346 a 1299 righe, design-first. Ho eliminato la vecchia regola “non stilare ogni modulo” — era esattamente la causa del minimalismo — e imposto profondità: box-shadow, letter-spacing, animazioni, border-radius su ogni sezione.
Ma la cosa più istruttiva è stata scoprire che il design in Divi 5 è pieno di trappole a livello di dati, non di gusto:
- Un gradient come stringa manda in fatal error PHP il render server-side.
"gradient": "linear-gradient(...)"non è supportato: solo colori solidi. Una stringa sbagliata e la pagina non carica. - Il colore di un titolo vive in due path contemporaneamente. Metterlo solo in
module.decoration.font.fontnon basta: Divi 5 legge anchetitle.decoration.font.font.desktop.value.color. Scordarne uno = heading del colore sbagliato. - Unicode escape non decodificati (
u003cpu003einvece di<p>) che finivano visibili in pagina. - Un campo
companydel testimonial che la mia struttura passava come stringa e Divi 5 voleva come oggetto: due pagine su cinque non renderizzavano finché non l’ho capito.
E il caso che dà il titolo a questo diario in versione onesta: il colore accent iniziale, #E94560, era ovunque — sette volte come sfondo di sezione nella sola home — e per giunta non passava il contrasto WCAG (3.83:1, sotto la soglia AA di 4.5:1). L’ho sostituito con #C73550 (5.18:1, AA) e ho scritto nel design system la regola inviolabile: accent mai come sfondo, solo su bottoni e link, max 5-10% della superficie. Trenta sostituzioni, una palette di 13 combinazioni pre-approvate e accessibili, marchiate come non negoziabili nel prompt.
Il verdetto finale, dopo due giorni su questo e nient’altro: “bello ed elegante finalmente!”. Nessuno dei 9 agenti era cambiato. Era cambiato il vincolo estetico che li governava.
Gotcha onesti
- Il file di config mente sul conteggio.
agent-config.jsonsi intitola ancora “Configurazione degli 8 agenti”, ma di step ne elenca 9: il Content Injector (step 6, l’unico senza LLM, solo REST batch) è nato dopo il disegno originale a 8 agenti del BOOTSTRAP. La realtà ha aggiunto un pezzo di idraulica e la documentazione non ha rincorso. Lo lascio scritto perché è tipico. - Le shortcut widget non funzionano con Divi 5. Vanno usati i tipi
divi/*viabuild_page; il formato è WordPress Block (<!-- wp:divi/module {JSON} -->), non lo shortcode di Divi 4. - La ricerca immagini stock è morta sul nascere. Openverse blocca gli IP da datacenter: 42 query, zero risultati. Serve un proxy con IP residenziale, e comunque le query generate dall’LLM erano troppo descrittive (“Icona servizio Branding & Identity”) invece che termini stock efficaci. Le immagini restano il buco aperto.
- Un
seddi massa mi ha svuotato 4 pagine. Recuperate ricostruendole dai.divi5.jsonvia inject. Backup prima di fare find-and-replace su contenuti generati.
Come va
È un lab, non un prodotto. Su questo stack: 39 story chiuse senza rework finale, 12 bug trovati e fixati, 5 pagine WordPress reali generate dalla pipeline, ~340KB di knowledge base su Respira e Divi 5. La regola di sicurezza è rigida per costruzione: ogni modifica è editTarget: "duplicate", mai publish su un duplicato, snapshot UUID registrato per il rollback, e un gate di approvazione umana obbligatorio tra QA e Deploy. L’automazione arriva fino alla porta; la maniglia la tiene una persona.
Il gap dichiarato resta uno solo, ed è esattamente quello che mi aspettavo di non trovare: la qualità del design.
Cosa ho imparato
Che avevo l’intuizione ribaltata. Pensavo che il difficile fosse orchestrare nove agenti, passarsi il contesto, tenere in piedi il cluster. Quella è la parte risolvibile — sono redirect, timeout, nomi di file, MAX_TOKENS. Bug con uno stack trace, che si chiudono in minuti.
Il difficile è il gusto. “Non fa schifo” non è uno stato che un agente raggiunge da solo: è un vincolo che devi codificare. Un design system di 1400 righe, un prompt di 1300, 13 colori che passano il contrasto e una regola che dice “l’accent non è uno sfondo”. Il valore di un’agenzia non era mai stato saper mettere online un WordPress in 22 minuti. Era il giudizio su cosa toglierne.
C’è un motivo se questo diario suona personale. Sto ricostruendo anche il mio, di sito — e ora so dove finirà davvero il tempo. Non nella pipeline. Nel non farlo sembrare brutto.