2026-05-09 | Pinperepette

Ogni Blocco Ha Un Nome

Il dibattito di questa settimana e' una falsa polemica. Tre fasi diverse, scambiate per una sola.

Document Format LLM Tokens Multi-Agent Edit Rust
Premessa

Ieri sera ho letto un post di Simon Willison che amplifica un altro post, di Thariq Shihipar del team Claude Code di Anthropic. Tema: "the unreasonable effectiveness of HTML", cioe' Markdown e' troppo poco, dovremmo chiedere agli agenti di produrre HTML. Ho aperto Twitter, mi sono accorto che lunedi' (5 maggio) e' uscito mdream che fa esattamente l'opposto: converte HTML in Markdown con il 50% di token in meno, perche' "ogni token conta". Cloudflare a marzo aveva lanciato un servizio simile. Sono andato a leggere meglio: stanno tutti dicendo cose molto sensate e molto in conflitto fra loro.

Mi sono reso conto che il dibattito e' una falsa polemica. Tre persone serie litigano su tre problemi diversi, scambiati per uno solo. Il pezzo prova a separarli, e a guardare la casella che resta vuota una volta separati. Quella casella mi ha fatto scrivere mille righe di Rust in un giorno per provare a riempirla. Spoiler: il prototipo funziona, ma non risolve la falsa polemica. Risolve un problema diverso, che probabilmente non e' ancora vostro. Forse lo diventera' quest'anno.

// Il Post Di Ieri

Sezione 1. Anthropic spinge HTML, e ha ragione su quello che dice

L'8 maggio 2026 Simon Willison pubblica Using Claude Code: The Unreasonable Effectiveness of HTML. Riprende un post di Thariq Shihipar, che lavora sul team Claude Code dentro Anthropic. La tesi di Shihipar in due righe e' chiara: per gli artifact che gli agenti producono per gli umani, HTML e' meglio di Markdown.

I motivi che porta sono concreti, non opinabili:

Onesto sui downside: HTML costa 2-4× il tempo di generazione, i diff in PR sono noisy, "in token usa di piu' ma con il context da 1M di Opus 4.7 non si nota". Spende esplicitamente piu' token in cambio di artifact che effettivamente leggi.

Se quello che ti serve e' un piano leggibile dal team con diagrammi e mockup veri, ha ragione lui — HTML e' meglio.

// La Controspinta

Sezione 2. mdream, Cloudflare, e perche' Markdown non e' affatto morto

Il giorno prima, lunedi' 5 maggio 2026, esce mdream di Harlan Zw, JavaScript library da 6 KB gzipped che converte HTML in Markdown. Filosofia esplicita nella documentazione: every token counts. Output con il 50% di token in meno rispetto a Turndown, 3× piu' veloce, 1.8 MB di HTML processato in 60 ms. La promessa: pipeline RAG piu' efficienti, retrieval piu' denso, context window meno congestionato.

Il 5 marzo Cloudflare aveva lanciato Markdown for Agents. Funzionamento: i crawler AI mandano un header Accept: text/markdown, gli edge server di Cloudflare convertono al volo, restituiscono Markdown con un header aggiuntivo x-markdown-tokens. Esempio citato nell'annuncio: un blog post da 16.180 token in HTML diventa 3.150 token in Markdown. Risparmio dell'80%.

John Mueller di Google ha definito Markdown for Agents "a stupid idea", perche' rimuove contesto e struttura. Cloudflare l'ha lasciato passare. Questa e' la posizione mainstream del mercato adesso: per fare ingestion di contenuti web verso un LLM, il Markdown e' una vittoria di defaults a tre cifre percentuali in costo.

Microsoft il 17 aprile ha rilasciato MarkItDown, converter universale per file Office, PDF, immagini, audio → Markdown. Stessa filosofia: per dare contesto agli LLM, Markdown vince.

L'argomento profondo della controspinta non e' solo il conteggio token. E' che gli LLM sono pretrained su miliardi di token di prosa e codice, contro una frazione di HTML soup. Quando produci HTML come input per il modello paghi due volte: piu' token e meno allineamento con la distribuzione di training. La densita' semantica del Markdown si paga in espressivita', si guadagna in comprensione.

// Il Trucco

Sezione 3. Stanno parlando di cose diverse

Shihipar parla di output: cosa l'agente produce per te.

Cloudflare e mdream parlano di input: cosa tu fai vedere all'agente.

Sono fasi diverse del workflow, con vincoli opposti. Shihipar ha 1M token di context window, gli costa quasi nulla aggiungere CSS e SVG, in cambio gli torna un PDF leggibile. Cloudflare deve farti pagare 16.180 token invece di 3.150 per ogni pagina che dai in pasto a un crawler che fa retrieval batch su milioni di URL. La vittoria del primo non e' la sconfitta del secondo, e viceversa.

Quando piu' osservatori onesti misurano la stessa cosa con strumenti diversi e ottengono risposte diverse, di solito non stanno misurando la stessa cosa. Stanno guardando facce diverse di un oggetto che hanno chiamato con lo stesso nome.

Il dibattito di questa settimana sembra "Markdown contro HTML, chi vince per gli LLM". E' una semplificazione che salta in aria appena guardi quale fase del workflow stanno ottimizzando. Tre fasi, tre vincitori diversi.

FASE 1 · INGESTION
Markdown
−80% token, semantic density
L'agente legge documenti per rispondere. Pretraining massivo su testo + codice, MD e' piu' vicino alla distribuzione di training. Cloudflare, mdream, MarkItDown, llms.txt: tutto questo polo punta a comprimere l'input.
FASE 2 · OUTPUT RICCO
HTML
SVG, interazione, sharing
L'agente produce artifact per umani. Diagrammi veri, tabelle navigabili, sliders per tuning, copy buttons che riportano al prompt. Shihipar e Anthropic ci credono al punto da cambiare default sul team.
FASE 3 · EDITING
??? (casella vuota)
N agenti modificano lo stesso doc nel tempo
Nessuno dei due formati ha ID stabili, forma canonica byte-stable, edit operations come dati. Markdown e' un disastro su tutte e tre. HTML va meglio sugli ID ma costa caro in token e i diff sono illeggibili.

Il punto del pezzo e' la terza casella. La fase 1 e' coperta dal mainstream Markdown. La fase 2 e' coperta dalla nicchia HTML che cresce questa settimana. La fase 3 nessuno la sta misurando, ed e' quella che fra dodici mesi vi mordera'.

// Timeline Della Settimana

Sezione 4. Cinque pezzi in due mesi, come incastrarli
5 mar 2026
Cloudflare · lancia Markdown for Agents. Header Accept: text/markdown, conversione edge-side, esempio 16.180 → 3.150 token. John Mueller di Google la chiama "stupid idea". Polo INPUT.
17 apr 2026
Microsoft · rilascia MarkItDown, converter universale (Office, PDF, immagini, audio) verso Markdown per ingestion. Polo INPUT.
~ apr 2026
codersera · State of llms.txt: solo 10.13% dei domini lo hanno, nessun effetto SEO misurabile. Tutti i devtool serii lo shippano comunque. Limbo. Polo INPUT.
5 mag 2026
Harlan Zw · pubblica mdream, converter HTML→MD ottimizzato per LLM. 6 KB gzipped, 50% token in meno di Turndown, 3× piu' veloce. Polo INPUT.
8 mag 2026
Thariq Shihipar (Anthropic) + Simon Willison · argomentano HTML come output format per Claude Code. Tabelle, SVG, sliders, sharing via S3. Polo OUTPUT.
9 mag 2026
questo post · nessuno ha ancora messo il polo EDITING al tavolo.

Quattro voci sul polo input, una sul polo output, zero sul polo editing. Il debate ha un punto cieco. Se non ti accorgi che le tre fasi sono distinte, leggi il post di Shihipar e pensi "ma allora Cloudflare ha sbagliato?". Non ha sbagliato. Stanno parlando di cose diverse.

// La Domanda Mancante

Sezione 5. Cosa succede quando il documento dura mesi

Tutta la letteratura della polemica corrente assume un workflow single-shot. L'utente scrive un prompt, l'LLM legge contesto e produce output, fine. Per quel mestiere Markdown vince in input, HTML inizia a vincere in output ricco, e la decisione e' chiara abbastanza.

Esiste un secondo mestiere che non e' nei benchmark, e non e' ancora un commodity production pattern, ma sta arrivando: piu' agenti diversi modificano lo stesso documento nel tempo. Knowledge base interne aggiornate da agenti per mesi, runbook operativi mantenuti da SRE bot, spec di RFC redatte da swarm di agenti, checklist d'incidente con audit trail. Non e' fantascienza, e' lo scenario operativo di chi sta deployando agenti in produzione adesso.

Cambia tutto. Se piu' agenti devono editare lo stesso documento, ti serve:

Proprieta' Markdown HTML JSON
ID stabile per blocco editabile No (heading anchors non sono universali) Si' (id="...") Si' (chiave dell'oggetto)
Forma canonica (stesso AST → stessi byte) No (CommonMark vs GFM vs MDX) No (whitespace, ordering, attribute quoting) Sostanzialmente si' (con sort)
Parser deterministico (stesso input → stesso AST) No (ambiguita' su nesting) Si' (DOM standard) Si'
Edit operations come dati (replay, merge, audit) Diff testuali fragili DOM diff (verboso, difficile) JSON Patch (RFC 6902)
Leggibile in cat Si' No (chiusure, attributi, soup) Mediocre
Diff in PR utile per code review Mediocre No (Shihipar lo ammette esplicitamente) No

Markdown e' un disastro su quasi tutte le righe tranne due. HTML e JSON vanno bene strutturalmente ma costano caro in token e leggibilita'. Il quadrante mancante e' "abbastanza compatto da non bruciare context window, abbastanza strutturato da permettere edit chirurgici, abbastanza umano da leggerlo in cat". Nessuno dei tre formati popolari sta in quel quadrante.

La domanda diventa: qual e' il formato giusto per un documento di lunga vita editato da piu' agenti?

Onestamente, prima di andare oltre. Tutto quello che hai letto fin qui e' la polemica reale. Quello che segue e' un esperimento per la casella vuota. Se ti serve la risposta a "quale formato uso oggi nel 95% dei casi", la risposta e' Markdown per input, HTML se vuoi un artifact ricco da condividere, e basta. Se sei in produzione e devi scegliere adesso, smetti di leggere e scegli uno dei due. La sezione 6 in poi parla di un caso che probabilmente non hai ancora.

// Tre Regole, Un Sigillo

Sezione 6. AGD, un prototipo per la casella vuota

Per la mia testa, la risposta alla casella vuota e' un formato che eredita il line-oriented di Markdown e ci aggiunge tre cose: ID di blocco stabili, sintassi LL(1) deterministica, operazioni di edit come dati JSON. Il prototipo si chiama AGD (Agent Document) ed e' su github.com/Pinperepette/agd. Rust, MIT, v0.1.0.

Ogni blocco AGD inizia con @<tag> a colonna 0. E' l'intera storia sintattica.

// metadati del documento, attributi key=value @meta title="Welcome" author=alice // heading con ID stabile in coda @h1 Hello [#intro] @p Body text. Inline supporta *bold*, _italic_, `code`. // lista, item su righe successive @ul [#features] - token-efficient vs HTML - LL(1) parser - stable per-block IDs // fence verbatim per codice @code lang=python [#hello] ~~~ def hello(): return "world" ~~~ // cross-reference a un altro blocco @ref #hello

Tre regole, niente di piu':

REGOLA 1
Un sigillo, a colonna 0
L'@ apre sempre un blocco. Markdown ha #, *, >, -, spazi indentati, ognuno con regole diverse. AGD ne ha uno solo. Il lexer e' una macchina a 7 stati line-oriented in 150 righe di Rust.
REGOLA 2
ID opzionale, sempre in coda
[#nome] alla fine di qualunque blocco lo rende indirizzabile. Chiunque puo' editarlo per ID, non per offset di byte. E' la feature load-bearing del formato. Il resto sono accessori.
REGOLA 3
Niente chiusure
Riga vuota o un altro @ chiudono il blocco precedente. L'equivalente di <h1>...</h1> e' solo @h1 .... Niente nesting profondo, niente DOM tree, niente XML soup.

La grammatica completa e' frozen in grammar/agd.ebnf — 50 righe di EBNF. Nessun backtracking, nessun lookahead oltre la riga corrente. Il parser e' single-pass, LL(1). Il senso di tutto questo e' che lo stesso file dato a due implementazioni diverse di AGD deve produrre lo stesso AST. E' la proprieta' che HTML ha (DOM standard) e Markdown non ha (CommonMark vs GFM vs MDX disagree su edge cases).

// Quello Che Promettevo, Quello Che E' Uscito

Sezione 7. La onesta' fa male e va fatta

Quando ho buttato giu' il design, prima di scrivere una riga di Rust, avevo fatto stime token a vista. Erano sbagliate. Lo dico subito perche' il pezzo non funziona se mento.

Promessa iniziale Misurato (corpora 100 → 100k blocchi) Verdetto
−5 a −10% vs Markdown +18 a +22% (AGD costa di piu') Sbagliato di segno
−30 a −40% vs HTML −16 a −19% Direzione giusta, ridotto a meta'
−50% vs JSON −56 a −59% Onesto, leggermente meglio del previsto
"Parser ~200 righe" ~1000 righe Rust Equivalente a 300 righe Python (overhead di linguaggio)

L'errore peggiore sta sulla riga uno. Avevo in testa che @h1 e # fossero entrambi 2 token. Falso: @h1 tokenizza come 3 token con BPE cl100k_base, mentre # e' 1 token. Su 1000 blocchi sono gia' 2000 token di prefisso. Misurato su corpora di 100k blocchi, AGD costa il 20% in piu' di Markdown a tutte le scale, con una banda 18-22% molto stretta.

Vince invece contro HTML del 16-19%, contro JSON del 56-59%. Niente di sensazionale rispetto a XML. Il +20% rispetto a Markdown e' il prezzo onesto degli ID espliciti e dei prefissi @<tag>: lo paghi sempre, non c'e' un trucchetto per recuperarlo a livello sintattico.

// La Scoperta Vera

Sezione 8. L'index batte il find lineare di 2625x

Il valore di AGD e' indicizzare i blocchi per ID. Il primo design ingenuo era Document::find(&id) con linear scan: O(n). Per 100 blocchi va bene. Per 100k inizia a fare male. Quanto male? Misurato:

Blocchi Linear find Indexed find Speedup
10080 ns25 ns
1.0001.6 µs26 ns62×
10.00021 µs36 ns583×
100.000283 µs108 ns2625×

Senza l'index, ogni edit operation costa 283 µs solo per trovare il blocco target su un documento da 100k entries. Con l'index, 108 ns. Differenza di tre ordini di grandezza.

La conseguenza architetturale e' importante e l'avevo sottovalutata: chiunque usi AGD seriamente deve costruirsi un indice. Non e' un'ottimizzazione, e' la differenza fra "usabile" e "inutilizzabile". Il codice client ideale e' questo:

use agd::{parse, edit::Operation, index::DocumentIndex}; // parse una volta sola let mut doc = parse(&source)?; let idx = DocumentIndex::build(&doc); // O(n) una volta // applica N edit, lookup costa O(1) for op in ops { if idx.position(op.target_id()).is_some() { doc.apply(op)?; } }

Il pattern "parse-once, edit-many" gira a 500k op/sec via library API. Lo stesso flow via CLI subprocess (un agd edit per operazione) gira a 76 op/sec. Differenza: 6500×. Implicazione: AGD ha senso solo se mantieni il documento parseato in memoria in un servizio, non se invochi la CLI in loop.

Conseguenza per l'architettura. Qualunque adozione seria di AGD deve avere la forma di un demone che mantiene i documenti in memoria, espone le edit operations via socket o RPC, ricostruisce l'index dopo ogni write batch. Senza questo strato, AGD non vale il +20% di token che paga rispetto a Markdown. Con questo strato, vale per il 5% dei casi dove l'editing multi-agente conta davvero.

// Tre Agenti, Stesso Documento, Tre Formati

Sezione 9. Lab multi-agente con Redis Streams

La teoria della casella vuota dice "AGD vince per editing multi-agente". Da soli quei numeri non valgono niente. Ho costruito il lab che dimostra il punto.

Stesso scenario operativo — un piano di risposta a un incidente di security — reso in tre formati: Markdown, HTML, AGD. Tre processi agent indipendenti (analyst, responder, auditor) emettono 12 edit operation a Redis Streams in parallelo. Tre demoni, uno per formato, consumano FIFO con XREADGROUP, applicano l'op alla loro versione del documento (chiave Redis Hash), fanno XACK. Lo stream e' l'audit trail nativo; il replay da XRANGE 0 + ricostruisce lo stato.

┌──────────────────────┐ agent-analyst ──▶ │ │ ──▶ daemon-md ──▶ HSET md:state agent-responder ──▶ │ Redis Streams (3×) │ ──▶ daemon-html ──▶ HSET html:state agent-auditor ──▶ │ agd-lab:<fmt>:ops │ ──▶ daemon-agd ──▶ HSET agd:state └──────────────────────┘ ↑ XACK + retention = audit

Il workload contiene una operazione cattiva alla riga 4: l'analyst rinomina la sezione "Findings" in "Initial findings". Cinque secondi dopo, l'auditor aggiunge un finding tardivo targettando il logical id findings. Il punto: il rename ha cambiato il nome ma non l'id. Markdown non ha un meccanismo di stable id, HTML e AGD si'.

Risultato di una run reale (12 ops emesse in ~600 ms wallclock, demoni concorrenti):

metric (mediana di 5 run) markdown html agd
ops applied11/1212/1212/12
ops not_found100
stream length (audit trail)121212
replay reconstructs live stateyesyesyes
final size (bytes)527895697
avg apply latency (per op)118 µs1.21 ms2.3 µs
throughput (op/sec)~8.500~830~430.000

Tre osservazioni che vale la pena fare prima di andare oltre.

Markdown perde una op. Il regex per ## Findings non trova piu' la sezione dopo il rename. L'op dell'auditor finisce nello stream ma il demone la registra come target_not_found. Lo stream e' onesto, lo stato finale e' incompleto. HTML e AGD applicano tutte e 12 — gli id resistono alla rinominazione del titolo.

Replay funziona ovunque. Lo stream e' authoritative: rieseguendo le ops dall'offset 0 su uno stato iniziale fresco ottengo byte-per-byte lo stesso stato live. Vale per tutti e tre i formati. Vuol dire che l'audit log Redis e' l'unica cosa che devi conservare: lo stato live e' una funzione del log, non un database separato. Per uno scenario di compliance — "fammi vedere come era il documento alle 14:31:07 di tre settimane fa" — basta XREAD fino a quel timestamp.

Sulla latenza vale la pena soffermarsi. AGD applica un'op in 2,3 microsecondi mediana — 500× piu' veloce di HTML (BeautifulSoup), 50× piu' veloce di Markdown (regex puro). Non e' magia: il demone agdd e' scritto in Rust, parsea il documento una sola volta all'avvio, costruisce un DocumentIndex in memoria, applica ogni op come mutazione strutturale tipata via la library API. Niente subprocess, niente fork+exec, niente reparse tra ops. Il prezzo e' aver scritto il demone in Rust invece che Python: ~150 righe di codice in src/bin/agdd.rs nel repo agd.

HTML e MD nel lab girano in Python con BeautifulSoup e regex. Una versione Rust di entrambi (lxml-rs, regex crate) probabilmente farebbe un po' meglio, ma la differenza strutturale resta: HTML deve riserializzare l'intero DOM ad ogni mutazione, AGD muta in-place strutture tipate.

Onestamente: il lab confronta tre demoni con livelli di engineering diversi. AGD demone Rust nativo, HTML demone Python con BS4, MD demone Python con regex. Una versione Rust dei demoni HTML e MD ridurrebbe il gap — non lo annullerebbe (HTML deve comunque riserializzare il DOM, MD deve comunque cercare per nome senza ID stabili) ma il rapporto di 500× e' artefatto del bridge Python tanto quanto del formato. La cifra che resta solida e' che AGD ha un demone Rust di 150 righe, ben definito, che fa quello che deve in microsecondi. Per il caso d'uso multi-agente e' una proprieta' rilevante: scrivere il demone e' lavoro fatto una volta, le ops sono di 2 µs per sempre.

Numeri di base sul motore AGD, dal repo agd (riproducibili con cargo run --release --bin agd-bench): parse 60 MB/s, serialize 830 MB/s, find by ID a 100k blocchi via DocumentIndex in 108 ns. Vedi benches/BENCHMARKS.md.

Onestamente, cosa NON dimostra questo lab. Non dimostra il lost-update problem: gli agenti emettono ops semantiche (kind/target/payload), non blob, e il demone serializza via stream FIFO — quindi ogni op atterra in modo coerente. Il lab dimostra che se gli agenti seguono questa disciplina, AGD non perde dati. Se invece gli agenti emettono blob (es. "scrivi tutto il file con questo contenuto"), il problema dei conflitti torna in vita per qualunque formato. AGD non lo previene a livello sintattico, lo rende solo piu' facile da disciplinare a livello di Operation API.

Il codice del lab gira in cinque secondi su qualunque macchina con docker + python3 + cargo installati: scripts/ogni-blocco-ha-un-nome/v2_redis/run_lab.sh. Output completo: output/report.md, output/daemon-{md,html,agd}.log con audit trail tab-separated, output/final.{md,html,agd} con i tre documenti finali. Tutto riproducibile, tutto sul repo del blog.

Bug trovato dal lab. Prima versione del workload aveva set_attr su #root (un blocco @h1). Il parser AGD v0.1 ignora gli attributi sui blocchi inline-bearing (h1-h4, p): legge tutto come testo. Quindi set_attr severity=high su #root produceva @h1 severity=high SSH brute force [#root] dove "severity=high" finisce dentro il titolo, non come attributo. La canonical form era idempotente (riparsa identico) ma il dato semantico era sbagliato. Aggirato spostando set_attr su #meta nel workload. La fix vera del parser e' tracked per AGD v0.2 — il lab ha trovato un problema reale che lo unit test del repo agd non aveva coperto.

// Riprodurre I Benchmark

Sezione 10. Il codice e' su GitHub, i numeri sono replicabili

Tutto quello che hai letto e' verificabile con cinque comandi. Niente nascosto, niente hand-waved. Repository: github.com/Pinperepette/agd.

# 1. clone + build (richiede cargo) git clone https://github.com/Pinperepette/agd.git cd agd cargo build --release # 2. parse e validate uno degli esempi ./target/release/agd validate examples/api-doc.agd ./target/release/agd parse --json examples/api-doc.agd | head -30 # 3. token benchmark vs MD/HTML/JSON ./target/release/agd bench examples/api-doc.agd # 4. genera il report completo (corpora 100/1k/10k/100k blocchi) ./target/release/agd-bench # scrive benches/BENCHMARKS.md con tutti i numeri # 5. applica una edit operation per ID ./target/release/agd edit examples/multi-agent-task.agd --op '{ "op": "set_attr", "id": "status-t2", "key": "flagged", "value": true }'

Il punto 4 e' quello che ti convince o ti smonta. Genera corpora sintetici deterministici (stesso seed, stesso byte output su qualunque macchina), parsea, serializza, edita, conta token, confronta con pulldown-cmark. Output finale: benches/BENCHMARKS.md, lo stesso file da cui ho preso tutti i numeri di questo post.

Tre scoperte uniche del lab che vale la pena fissare:

SCOPERTA 1
pulldown-cmark e' 2-3× piu' veloce
Su documenti grandi, il parser Markdown ottimizzato vince contro il mio AGD parser. AGD parsea a ~60 MB/s, pulldown a ~150 MB/s. Era atteso (lui ha 5 anni di ottimizzazione, io un giorno). AGD non vince in velocita' assoluta, vince in determinismo.
SCOPERTA 2
Serialize e' 10× piu' veloce di parse
~830 MB/s sostenuti. Asimmetria tipica: parsare richiede branching, serializzare e' append lineare. Conseguenza: i workflow agentici dove molte edit producono molte serializzazioni sono limitati dal parse iniziale, non dalle scritture.
SCOPERTA 3
AST in memoria pesa 4× la source
11.9 MB di AGD source diventano 49.8 MB di Document parseato. Costante a tutte le scale. Per documenti enormi (gigabyte) significa che non li tieni tutti in memoria, ti serve uno streaming parser. Per ora non c'e'.

// Vale La Pena Spendere Piu' Token?

Sezione 11. La risposta secca, in due numeri

Il "+20% di token" l'abbiamo gia' detto sei volte. Misurato di nuovo, su corpora controllati di 100, 1.000 e 10.000 blocchi, e' confermato: AGD costa il +18-22% in piu' di Markdown quando carichi l'intero documento. Banda stretta, scala ortogonale, niente sorprese.

Quello che il post ha taciuto fino a qui e' che il +20% e' solo meta' della storia. L'altra meta' e' che AGD abilita una forma di richiesta che Markdown non puo' fare: caricare il Table of Contents (lista degli ID), scegliere il blocco, caricare solo quello. Un agente in stile Claude Code che cerca informazioni in un documento di 10.000 blocchi non deve leggerlo tutto. Pesca l'ID giusto e ne legge uno.

Misurato:

blocchi AGD selective (TOC + 1 blocco) Markdown whole-doc speedup
100231 token2.074 token9,0×
1.0001.720 token20.502 token11,9×
10.00014.902 token217.170 token14,6×

Lo speedup cresce con la scala. A 10.000 blocchi, una richiesta mirata su AGD costa 1/15 di un caricamento completo Markdown. A 100.000 blocchi diventa ~1/20. Il crossover — il punto in cui AGD ti ripaga il +20% del primo caricamento — e' dopo la seconda lookup mirata sullo stesso documento. In quasi tutti i workflow agentici reali quel breakeven arriva nei primi minuti.

I numeri sono nel benchmark benches/RETRIEVAL.md del repo agd, riproducibili con cargo run --release --bench retrieval.

Le due cifre stanno insieme. Il +20% e' il costo che paghi quando carichi tutto, il fattore 14× e' lo sconto che ottieni quando leggi solo quello che ti serve. Quale dei due conta di piu' dipende dal pattern di accesso del tuo agente, non dal formato in se'.

Conta i casi uno per uno con questa lente.

RAG WHOLE-DOC INGESTION
Carichi sempre l'intero documento, non fai mai lookup mirati. Markdown vince del 20%. AGD costa di piu' senza dare niente. Cloudflare serve nativo Markdown per questo caso.
OUTPUT RICCO (FASE 2)
L'agente produce un artifact per umani. Shihipar ha ragione, HTML vince. AGD non e' renderizzabile in browser.
DOCUMENTAZIONE STATICA
README, blog, docs. Markdown ha 15 anni di tooling (Hugo, Jekyll, MDX, GitHub render). AGD ha zero ecosistema.
PROMPT ENGINEERING CLAUDE
Anthropic spinge XML tag come delimitatori. Claude e' trained su quelli. AGD potrebbe funzionare, ma non sfrutti il pretraining. Resta XML.
SELECTIVE RETRIEVAL (CLAUDE CODE)
L'agente cerca un blocco specifico (#auth-flow) in un documento di 10k+ blocchi. AGD: TOC + 1 blocco = 14k token. Markdown: 217k token interi. 14× meno token, scala con la dimensione.
MULTI-AGENT EDIT (FASE 3)
Cinque agenti aggiornano una checklist d'incidente, un piano operativo, una specifica RFC. Audit, replay, merge per ID. AGD vince perche' Markdown non e' strutturato e HTML non e' canonicalizzabile.
DOCUMENTI DI LUNGA VITA
Knowledge base aggiornate da agenti per mesi. La forma canonica byte-stabile rende i diff utili in code review. Markdown drifta.
REPLAY E AUDIT
Workflow dove le edit operations vanno loggate, replicate, audit-trailed. Le ops AGD sono JSON puri serializzabili.

Conta i casi: 3 dove altri formati vincono, 1 pareggio, 4 dove AGD vince. La proporzione e' cambiata rispetto a quello che pensavo all'inizio — il selective retrieval e' una vittoria che il post non aveva contato. Pragmatica: se il tuo agente carica sempre tutto, usa Markdown. Se fa lookup mirati, AGD si ripaga dopo due query. Il salto di costo non e' lineare, e' di natura: passi dal regime "leggi tutto, paga proporzionale" al regime "leggi solo l'indice, paga la lista".

Nota di realta': se vuoi il 90% del valore di AGD senza buttarti su un formato nuovo, prova Markdown + kramdown anchors:

# Section title {#stable-id} Body of the section. ## Subsection {#sub-id} More body.

Hai gli ID, resti dentro l'ecosistema Markdown, GitHub li renderizza, Pandoc li capisce. Perdi la forma canonica rigorosa e il parser LL(1) puro, ma probabilmente non li userai mai. AGD ha senso quando perdere quei due e' un costo reale, non teorico — e oggi quei costi pochi li sentono.

// Quello Che Mi Resta In Mano

Sezione 12. Cosa e' uscito dopo una settimana di numeri

La polemica MD vs HTML di questa settimana e' viva e fondata, ma confonde tre fasi diverse del workflow degli agenti. C'e' la fase di ingestion (Markdown vince, e Cloudflare la serve nativa), la fase di output ricco per umani (HTML vince, e Anthropic la spinge), e una terza fase — l'editing collaborativo di documenti che durano nel tempo — per cui adesso non c'e' un formato dedicato. AGD e' un esperimento che prova a riempire quel buco.

Funziona, nei limiti che si pone. 89 test su 10 suite, proptest robusto, un lab Redis multi-agente che gira in cinque secondi, benchmark riproducibili sul repo. Costa il 20% di token in piu' di Markdown se carichi tutto il documento e ne risparmia un fattore 14 se cerchi un blocco specifico. Pulldown-cmark resta 2-3 volte piu' veloce nel parsing su file grandi, ma quel campionato AGD non lo sta giocando: scrivendo il demone in Rust e tenendo il documento in memoria la latenza per op va a 2,3 microsecondi, e a quel punto la velocita' assoluta del parser conta poco perche' parsi una volta sola.

Quello che mi porto a casa pero' non sono i numeri. E' una mappa del design space che a inizio settimana non avevo. Il +20% di token cambia segno appena l'agente smette di leggere tutto e inizia a chiedere blocchi specifici, e questo non lo si capisce finche' non si misura. Il determinismo del parser e' una proprieta' che non sapevo di volere finche' non ho visto un regex Markdown rompersi su un rename in produzione. Capire dove conviene combattere e dove no, prima di adottare qualcosa, e' tutto il valore di questa settimana.

Se ti capita davvero il problema dell'editing multi-agente, AGD e' un punto di partenza riproducibile da cui rubare idee, fare fork, oppure semplicemente buttare via tutto e tornare a Markdown con kramdown anchors sapendo cosa stai perdendo. Il valore del prototipo per me e' stato quello: rendere visibile un trade-off che senza misurarlo restava una sensazione.

Codice del lab: tutto sta in scripts/ogni-blocco-ha-un-nome. Due versioni accanto: lab.py sequenziale single-process (richiede solo Python 3.9+, BeautifulSoup, lxml, agd CLI) e v2_redis/run_lab.sh con tre processi concorrenti, Redis Streams, demone agdd nativo (richiede in piu' Docker per il container Redis 8). I numeri citati nell'articolo vengono dalla v2.

Codice del prototipo AGD: il formato e il toolchain sono su github.com/Pinperepette/agd (Rust, MIT). Benchmark in benches/BENCHMARKS.md e benches/RETRIEVAL.md, riproducibili con cargo run --release --bin agd-bench e cargo run --release --bench retrieval. La spec e' dogfooded in spec/AGD-SPEC.agd — scritta in AGD, non in Markdown.

Riferimenti.

simonwillison.net/2026/May/8/unreasonable-effectiveness-of-html: Simon Willison riprende e amplifica il post di Thariq Shihipar (Claude Code team, Anthropic) — 8 maggio 2026. Polo OUTPUT.
blog.brightcoding.dev/2026/05/05/mdream: Harlan Zw, mdream — converter HTML→MD ottimizzato per LLM, 50% fewer tokens, 3× faster di Turndown. 5 maggio 2026. Polo INPUT.
infoq.com/news/2026/03/cloudflare-crawler: Cloudflare lancia Markdown for Agents (header Accept: text/markdown) — 5 marzo 2026. Polo INPUT.
blog.brightcoding.dev/2026/04/17/markitdown: Microsoft MarkItDown, converter universale → MD — 17 aprile 2026. Polo INPUT.
codersera.com/blog/llms-txt-complete-guide-2026: stato di llms.txt nel 2026 — 10.13% di adoption, nessun effetto SEO misurabile, ma "every serious devtool ships one anyway".
github.com/Pinperepette/agd: il prototipo AGD, Rust, MIT.