-----------------------------------

Acquista i software ArcGIS tramite Studio A&T srl, rivenditore autorizzato dei prodotti Esri.

I migliori software GIS, il miglior supporto tecnico!

I migliori software GIS, il miglior supporto tecnico!
Azienda operante nel settore GIS dal 2001, specializzata nell’utilizzo della tecnologia ArcGIS e aderente ai programmi Esri Italia Business Network ed Esri Partner Network

-----------------------------------



lunedì 21 settembre 2026

NicoGIS Tech Weekly — .NET 11 sotto il cofano, GeoAI embeddings e Agent Skills — 21 settembre 2026 - #3

Dal JIT al GIS semantico: quando l'astrazione incontra il costo reale

La settimana dal 14 al 20 settembre 2026 ha prodotto pochi temi davvero importanti, ma tecnicamente molto densi. Il pezzo dominante è l'analisi di Stephen Toub sulle performance di .NET 11: non una lista di percentuali, ma una radiografia del percorso che porta dal C# alle istruzioni native, passando per JIT, state machine async, GC, sincronizzazione, SIMD, syscall e diagnostica.

Sul fronte GIS, Esri ha pubblicato due contributi che meritano attenzione perché spostano l'AI geospaziale da "feature di prodotto" a modello architetturale: l'uso degli embeddings nei workflow di spatial analysis e una Agent Skill ufficiale per costruire custom widget Experience Builder. Nella stessa settimana Microsoft ha mostrato due evoluzioni complementari: un harness agentico C# costruito sopra IChatClient e un pattern in cui una competenza specialistica viene esposta come SKILL.md + tool MCP, senza necessariamente mantenere un secondo model loop.

Infine, Google ha introdotto Gemini 3.8 Live e Gemini 3.8 Live Extended Thinking, rendendo ancora più evidente una tendenza: per i voice agent il problema non è più solo speech-to-text più LLM più text-to-speech, ma orchestrare conversazione, reasoning e tool execution mantenendo viva l'interazione in tempo reale.


.NET 11 Performance Improvements: il runtime che prova a cancellare il costo delle nostre astrazioni

Il 15 settembre Stephen Toub ha pubblicato Performance Improvements in .NET 11, il consueto deep dive sulle ottimizzazioni introdotte nel runtime, nelle librerie e nel toolchain. .NET 11 è attualmente in Release Candidate e l'articolo invita esplicitamente a misurare i workload reali, perché non tutte le ottimizzazioni hanno lo stesso impatto e alcune funzionalità — in particolare runtime async — sono ancora opt-in e non completamente ottimizzate.

Fonte primaria: Microsoft .NET Blog — Performance Improvements in .NET 11

Il punto di partenza: C# non è ciò che esegue la CPU

C# source
    ↓
Roslyn
    ↓
IL
    ↓
CoreCLR
    ↓
JIT
    ↓
Native instructions
    ↓
CPU / cache / memory / kernel

Quando leggiamo un benchmark .NET, il numero finale è l'effetto di una catena. Una modifica al JIT può eliminare una branch, un bounds check o una chiamata virtuale senza cambiare una singola riga dell'applicazione. Una modifica nella BCL può evitare un'allocazione. Una modifica nel runtime può evitare la materializzazione di un Task<T>. Una modifica nella parte Linux può sostituire un percorso basato su file descriptor con una syscall diretta.

Deabstraction ed escape analysis: non pagare per ciò che il programma non può osservare

.NET continua ad ampliare la capacità del JIT di "smontare" astrazioni quando riesce a dimostrare che il comportamento osservabile resta identico. Questo comprende devirtualization, propagazione di informazioni di tipo ed escape analysis. Nell'esempio di Toub sul boxing di un Nullable<int>, .NET 11 riesce in uno dei casi a vedere che il box temporaneo non esce dal metodo e quindi elimina completamente l'allocazione heap.

Analisi tecnica. Questo è un punto architetturalmente importante: l'obiettivo non è suggerire di smettere di usare interfacce, generics o helper ben composti. È il contrario. Se il runtime riesce a rendere più economici i confini di astrazione, possiamo mantenere un codice leggibile e modulare senza trasformare ogni hot path in codice manualmente "flattened". Il rischio, come sempre, è assumere che il JIT riesca a vedere tutto: reflection, chiamate virtuali non risolte, escape reali dell'oggetto e boundary non inlinabili possono interrompere la catena di ottimizzazione.

Runtime async: la state machine si sposta dal compilatore verso VM e JIT

Questa è probabilmente la novità più interessante dell'articolo. In .NET 11 un'applicazione può abilitare runtime async con:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net11.0</TargetFramework>
    <Features>$(Features);runtime-async=on</Features>
  </PropertyGroup>
</Project>

Con il lowering tradizionale, Roslyn genera per ogni metodo async una state machine, campi per lo stato catturato, un MoveNext() e l'infrastruttura necessaria a rappresentare il risultato come task. Con runtime async, il metodo mantiene nel metadata la propria natura asincrona e il runtime può creare una variante di chiamata specializzata. Quando un metodo runtime-async attende direttamente un altro metodo runtime-async, il JIT può evitare di materializzare task intermedi che esistono solo per trasportare un risultato lungo la catena.

Nel micro-esempio a dieci livelli pubblicato da Toub, la DLL passa da 10.752 a 5.632 byte. In un benchmark a due livelli, la catena che completa sincronicamente passa da 21,221 ns e 144 byte allocati a 6,151 ns e zero allocazioni; dopo una sospensione reale, il benchmark mostrato passa da 254,139 ns / 248 byte a 116,927 ns / 168 byte. Sono microbenchmark del caso specifico, non percentuali applicabili automaticamente a un servizio web.

Analisi tecnica. Il vantaggio cresce dove l'architettura reale è composta da molti helper async piccoli:

HTTP endpoint
   ↓
authentication
   ↓
authorization
   ↓
validation
   ↓
business service
   ↓
retry / resilience
   ↓
HTTP / SQL / storage

Oggi ogni boundary può produrre un task/state-machine boundary. Runtime async prova a rendere alcuni di questi confini non osservabili e quindi eliminabili. È una forma di deabstraction applicata al modello asincrono.

Importante: Toub specifica che la feature non è ancora ottimizzata in tutti i casi, resta opt-in per l'applicazione e supporta Task, Task<T>, ValueTask e ValueTask<T>, ma non ancora async void, async iterator o arbitrary custom task-like return types.

Async profiling: osservare il logical stack senza distruggere il workload

Un profiler CPU tradizionale vede lo stack fisico del thread. Dopo un await, però, la continuation può riprendere su un altro thread; ricostruire la catena logica usando eventi Task molto dettagliati può diventare costoso. .NET 11 introduce un event stream più leggero, con buffer per-thread e record compatti. Toub riporta misure in cui l'overhead resta sotto l'1% e il volume di trace si riduce di circa un ordine di grandezza.

Valutazione. Per servizi ad alto throughput questo è quasi più importante del micro-ottimizzare un singolo metodo: una diagnostica abbastanza economica da restare attiva in produzione cambia la capacità di capire davvero le regressioni async.

Bounds checks e SIMD: il JIT deve dimostrare, non indovinare

La sicurezza della memoria impone a .NET di verificare che un accesso a array, stringhe e span sia entro i limiti. Il JIT elimina il check solo quando riesce a dimostrare la validità dell'indice. .NET 11 amplia diversi pattern riconosciuti dalla range analysis.

cmp ecx, dword ptr [rax+8]
jae THROW
mov edx, dword ptr [rax+rcx*4+16]

Se il JIT dimostra che ecx è sempre valido, quelle istruzioni possono scomparire dal percorso caldo.

Sul fronte SIMD, Toub mostra numerosi casi in cui .NET 11 conserva meglio valori vettoriali nei registri invece di spezzarli o passarli inutilmente dallo stack. In un esempio con un tipo numerico user-defined bitcast a Vector128<double>, il codice helper x64 mostrato nell'articolo passa da 52 a 22 byte.

Analisi tecnica. Qui entra in gioco l'hardware reale. Il guadagno dipende dall'ISA disponibile, dalla dimensione del vettore, dal costo di caricamento dei dati e dalla pressione sui registri. Un benchmark che usa AVX2 o AVX-512 non è automaticamente trasferibile a una VM con una CPU differente. Il deployment target diventa quindi parte della performance story.

GC: la generazione dei metadati conta quanto quella degli oggetti

Toub dedica una parte significativa al GC. Una delle ottimizzazioni riduce il lavoro che le raccolte ephemeral devono fare sui metadati sopravvissuti. Nel benchmark pubblicato con un milione di handle, una raccolta Gen0 passa da circa 10,7 ms a circa 0,31 ms.

Valutazione. Non significa che "il GC di .NET 11 è 34 volte più veloce". Significa che una struttura specifica che prima costringeva Gen0 a riesaminare molto stato sopravvissuto è stata riorganizzata. Il modo corretto di leggere questi numeri è chiedersi: il mio workload produce una forma simile di pressure?

Locking e false sharing: la CPU può contendere anche su dati logicamente indipendenti

Nel percorso Monitor.Wait/Pulse, .NET 11 evita una lookup separata tramite ConditionalWeakTable memorizzando direttamente sul lock la condition variable interna. Nel benchmark di ping-pong riportato da Toub il tempo medio passa da 4,194 μs a 3,517 μs.

Ancora più interessante è il caso del false sharing. Due contatori indipendenti possono trovarsi sulla stessa cache line: due core che scrivono su campi diversi finiscono comunque per contendersi la ownership della stessa linea di cache. .NET 11 riorganizza alcuni contatori di MemoryCache su cache line separate, accettando un piccolo overhead di memoria per ridurre il bouncing fra core.

Core 0                  Core 1
  ↓                        ↓
counter A              counter B
     \                  /
      SAME CACHE LINE
             ↓
      invalidation ping-pong

Questo è il tipo di ottimizzazione che ricorda perché la performance non finisce al linguaggio o al GC: arriva fino alla coerenza delle cache CPU.

Syscall: Guid.NewGuid() su Linux

Su Linux, Guid.NewGuid() si sposta dal percorso basato su /dev/urandom alla syscall getrandom(), evitando setup e letture attraverso l'astrazione del file descriptor.

C#
 ↓
BCL
 ↓
runtime
 ↓
syscall
 ↓
kernel

Una riga di C# apparentemente banale può quindi essere ottimizzata a un livello che l'applicazione non vede direttamente.

Observability: Activity, Metrics e logging sono parte dell'hot path

Tracing e metriche vengono eseguiti potenzialmente per ogni request. In un benchmark su ObservableGauge, .NET 11 evita un array temporaneo e la relativa enumerazione: il caso mostrato passa da 17,16 ns e 72 byte allocati a 4,511 ns e zero allocazioni. Anche qui: microbenchmark specifico, non promessa di accelerazione dell'applicazione.

Technical reading. Il tema trasversale dell'articolo è questo:

devirtualize
   ↓
inline
   ↓
propagate constants/ranges
   ↓
eliminate checks/allocations
   ↓
keep data in registers
   ↓
reduce synchronization/kernel crossings

Le grandi performance release non derivano quasi mai da una singola "magic optimization". Derivano da centinaia di piccoli percorsi che diventano più corti.


ArcGIS + embeddings: spatial proximity e semantic proximity non sono lo stesso spazio

Il 16 settembre Esri ha pubblicato Including Embeddings in Your Spatial Analysis Workflows. L'articolo è importante perché non vende gli embeddings come una scorciatoia magica: insiste sui problemi di scala geografica, aggregazione, interpretabilità, ecological fallacy e costruzione della similarity metric.

Fonte primaria: Esri — Including Embeddings in Your Spatial Analysis Workflows

Per confronto, la documentazione ArcGIS Pro sul tool Near definisce la prossimità come distanza geometrica minima, calcolabile in modalità planar o geodesic.

Fonte primaria: ArcGIS Pro — Near (Analysis)

Due metriche, due significati

Geometry space
(x, y, z, topology, network)
        ↓
spatial proximity

Embedding space
[e1, e2, ... en]
        ↓
semantic similarity

Due quartieri possono essere lontani centinaia di chilometri ma avere embedding geodemografici molto simili. Al contrario, due poligoni confinanti possono essere semanticamente differenti.

Per ArcGIS, Near risponde a domande del tipo "qual è la feature geometricamente più vicina?". Un nearest-neighbor nello spazio vettoriale risponde invece a "quale feature è più simile nella rappresentazione appresa?".

La scala geografica deve coincidere con la scala dell'embedding

Esri raccomanda, quando possibile, di utilizzare embeddings prodotti alla stessa scala dell'analisi. Se gli embeddings sono su celle H3 più fini e l'analisi è su poligoni più grandi, si possono aggregare dimensioni con media, mediana, deviazione standard o altre statistiche, ma Esri sottolinea che l'aggregazione di embeddings fra scale è ancora un'area di ricerca e può perdere informazione.

Il problema inverso è altrettanto serio: se un embedding è definito a livello di poligono e lo si assegna a molti punti interni, tutte quelle osservazioni ereditano lo stesso vettore. Esri collega esplicitamente il problema all'ecological fallacy: proprietà aggregate non diventano automaticamente proprietà degli individui contenuti nel poligono.

Non standardizzare automaticamente un embedding

Esri raccomanda cautela nel normalizzare o standardizzare le singole dimensioni prima di clustering e similarity search. Un embedding è una geometria appresa: modificarne arbitrariamente le dimensioni può deformare lo spazio semantico. L'articolo sconsiglia inoltre di mischiare direttamente embedding dimensions e variabili tradizionali dentro la stessa similarity metric.

Analisi tecnica. Questo suggerisce una pipeline più robusta di una semplice formula del tipo:

score = α * geographicDistance + β * cosineDistance

Le due distanze hanno unità, distribuzioni e significato differenti. Sommarle senza calibrazione produce un numero, non necessariamente una metrica sensata.

Una strategia spesso più leggibile è invece:

1. Spatial constraint
   ArcGIS Near / Generate Near Table / Spatial Join
          ↓
2. Candidate set
          ↓
3. Semantic ranking
   cosine / dot-product / vector NN
          ↓
4. Domain filters
          ↓
5. Final ranked result

Qui la geografia non è "un'altra feature" da sommare al vettore: diventa un vincolo di ricerca. Per esempio: "tra le aree entro 30 km o 20 minuti di percorrenza, trova quelle semanticamente più simili al profilo target".

Il caso USA Geodemographic Embeddings

Esri ha introdotto in beta nel 2026 gli USA Geodemographic Embeddings: oltre 5.000 variabili demografiche, socioeconomiche, ambientali e census-derived vengono compresse in più di 250 attributi di embedding su celle Uber H3 resolution 7. Il valore architetturale non è solo la riduzione dimensionale: è la disponibilità di un contesto territoriale precomputato che può essere usato per prediction, clustering e similarity search.

Fonte primaria: Esri — Introducing USA Geodemographic Embeddings

Valutazione. Questo avvicina molto GIS e vector retrieval, ma con una differenza fondamentale: nel GIS la scala, il sistema di riferimento, la topologia e l'unità territoriale non sono dettagli di preprocessing. Sono parte del significato del dato.


Experience Builder Agent Skill: SDK inizia ad avere una rappresentazione per gli agenti

Il 14 settembre Esri ha pubblicato una Agent Skill ufficiale per lo sviluppo di custom widget ArcGIS Experience Builder. La skill contiene convenzioni, framework API, struttura dei file, skeleton del widget e reference specializzate per data source, map/layer view, message e data action, theming, state, accessibility e altri aspetti del framework. L'agente carica solo la documentazione utile al task corrente.

Fonte primaria: Esri — Building Custom Experience Builder Widgets with an Agent Skill

Il folder ufficiale è skills/arcgis-exb-widget-dev nel repository Esri Experience Builder SDK Resources. Esri documenta percorsi differenti per Copilot, Codex, Claude Code e Cursor, tutti basati sullo stesso SKILL.md.

RAG e Skill non sono la stessa cosa

RAG
 ↓
"Quale conoscenza devo recuperare?"

Skill
 ↓
"Quale procedura devo seguire per svolgere questo lavoro?"

Il confine non è assoluto, ma la distinzione è utile. La documentazione API dice che cosa esiste. La skill descrive anche convenzioni operative: dove creare il widget, come separare runtime e builder, quali API preferire, quali file non dimenticare e quali pattern sono idiomatici.

Analisi tecnica. Questo è molto vicino a un nuovo livello di SDK:

SDK for humans
  API + docs + samples

SDK for agents
  API + docs + samples + procedural knowledge

Da skill locale a skill distribuita via MCP

Nella stessa settimana Microsoft Agent Framework ha pubblicato un articolo ancora più interessante: From Specialist Agents to Distributed Skills over MCP. Il principio è semplice: non ogni dominio specialistico ha bisogno di un proprio model loop.

Fonte primaria: Microsoft Agent Framework — From Specialist Agents to Distributed Skills over MCP

Pattern A — specialist agent
Parent Agent
   ↓ A2A
Specialist Agent
   ↓
Model
   ↓
Domain tools

Pattern B — distributed skill
Parent Agent
   ↓
load SKILL.md
   ↓
MCP tools
   ↓
Domain service

Nel secondo pattern il servizio resta distribuito, ma il reasoning specialistico si sposta nel contesto del parent agent. Il provider espone descrizione, istruzioni e tool tipizzati. Il model loop remoto scompare se non serve autonomia indipendente.

Nel test dimostrativo pubblicato da Microsoft, il percorso con specialist agent usa sei o sette model call, mentre il percorso con skill MCP ne usa tre. Ma il dato più interessante è il caveat: il percorso skill ha consumato nel piccolo test circa il 22% di token osservati in più. Meno model call non significa automaticamente meno contesto, meno token o costo inferiore. Microsoft sottolinea che il confronto non è uno studio controllato e che cache, lavoro eseguito e runtime differiscono.

Valutazione. La scelta quindi non è "A2A è vecchio, MCP è nuovo". È:

Serve autonomia indipendente?
  sì → specialist agent
  no → skill + typed tools può essere sufficiente

Questa distinzione è importante anche per GIS: geocoding, query layer, network analysis, editing o validazioni di dominio possono restare servizi separati senza richiedere necessariamente un LLM dedicato per ogni capacità.

Il segnale cross-vendor: Esri, Microsoft e DevExpress stanno convergendo sullo stesso pattern

DevExpress aveva già aggiornato ad agosto le proprie Agent Skills, dichiarando esplicitamente che una skill deve guidare l'assistente sui pattern corretti e utilizzare il Documentation MCP Server come fallback quando la conoscenza locale non basta. Non è una novità di questa settimana, quindi non la tratto come news, ma è un segnale architetturale importante.

Fonte primaria: DevExpress — Agent Skills Recent Updates

Skill
 ↓
known procedure / best practice
 ↓
MCP fallback
 ↓
authoritative API documentation / tools

Questa potrebbe diventare una delle architetture dominanti per i coding agent enterprise: knowledge locale piccola e curata + discovery dinamica + tool tipizzati + documentazione autorevole on demand.


C# Agent Harness: dal singolo IChatClient a un runtime governabile

Il 16 settembre Bruno Capuano ha pubblicato una serie pratica sul Microsoft Agent Framework harness. L'interesse non è il demo finanziario usato come esempio, ma la trasformazione di un semplice IChatClient in un agente con planning, tool invocation, file access confinato, approval, memory, skills, shell/code execution, background agents, OpenTelemetry, governance ed evaluation.

Fonte primaria: Microsoft .NET Blog — Build Your Own AI Agent Harness in C#

AIAgent agent = chatClient.AsHarnessAgent(
    new HarnessAgentOptions
    {
        ChatOptions = new ChatOptions
        {
            Instructions = instructions,
            Tools = tools
        }
    });

Un harness non è un prompt wrapper

Model
  + instructions
  + tool loop
  + planning
  + context compaction
  + memory
  + approval
  + skill loading
  + observability
  + evaluation
  + deployment boundary
= Agent runtime

Il framework offre componenti composabili per automatic function invocation, history persistence, planning, context compaction, file memory, web search quando supportata dal model service, approval e OpenTelemetry.

File access: confinamento prima dell'approvazione

L'esempio usa un FileSystemAgentFileStore radicato in una working directory. L'agente non riceve accesso arbitrario al filesystem: il boundary è costruito dall'host.

Agent
  ↓
FileSystemAgentFileStore
  ↓
approved working directory

Questo è un pattern più forte di "chiedi conferma prima di leggere un file": l'approvazione è una policy di interazione, il confinamento è una proprietà dell'ambiente.

Approval: non tutti i tool hanno lo stesso rischio

L'articolo mostra ApprovalRequiredAIFunction per azioni con side effect e regole di auto-approval per operazioni read-only. È la distinzione giusta: se ogni GET innocuo produce un dialog di conferma, l'utente impara a premere "Approve" senza leggere.

Analisi tecnica. Un catalogo di tool dovrebbe avere metadata almeno di questo tipo:

readOnly
idempotent
destructive
externalSideEffect
requiresUserContext
requiresElevation
maxExecutionTime
networkScope

Da questi attributi deriva la policy; non dal nome del tool.

Osservabilità ed evaluation devono stare dentro l'harness

Un agente che funziona in demo ma non espone model call, tool call, token usage, approval result, latency e failure path non è realmente operabile. L'harness Microsoft integra OpenTelemetry e porta esplicitamente evaluation e governance nella fase di productionization.

Valutazione. Questo è il passaggio dal "chatbot con funzioni" a una piattaforma software: il model diventa un componente sostituibile dentro un runtime governato.


LLM Watch: Gemini 3.8 Live separa la latenza conversazionale dal reasoning di background

Il 15 settembre Google ha introdotto Gemini 3.8 Live e Gemini 3.8 Live Extended Thinking. Il primo è orientato a voice agent a bassa latenza; il secondo aggiunge reasoning di background per workflow multi-step più complessi.

Fonti primarie:
Google — Introducing Gemini 3.8 Live and 3.8 Live Extended Thinking
Gemini Live API documentation
Thinking in the Live API

Protocollo: stateful WebSocket, non request/response stateless

La Live API usa una connessione WebSocket stateful. La documentazione corrente indica input audio PCM 16-bit a 16 kHz, immagini e testo; l'output audio è PCM 16-bit a 24 kHz. Questo significa che l'architettura di rete è parte del prodotto: gestione sessione, reconnect, backpressure, token temporanei e lifecycle della connessione diventano requisiti applicativi.

Client audio/video
      ↕ WSS
Gemini Live session
      ↕
Tools / APIs

Extended Thinking: l'interazione continua mentre il tool lavora

La variante gemini-3.8-live-extended-thinking può mantenere attiva la conversazione mentre effettua reasoning e tool call asincrone in background. La documentazione introduce uno stato di interazione IN_PROGRESS/IDLE e richiede tool NON_BLOCKING per questo modello.

User speaks
   ↓
model acknowledges
   ↓
interaction_status = IN_PROGRESS
   ↓
background reasoning
   ↓
async tool calls
   ↓
progress narration
   ↓
interaction_status = IDLE

Analisi tecnica. Il punto non è il filler vocale. È la separazione tra due latenze:

interaction latency
≠
reasoning / tool latency

Un buon voice agent non deve necessariamente completare tutto il lavoro prima di tornare a parlare. Può confermare la richiesta, avviare operazioni lente, continuare il dialogo e pubblicare il risultato quando il task termina.

Il costo nascosto delle sessioni live: contesto che si ricompone

La documentazione delle best practice di Gemini Live chiarisce un punto economico importante: la sessione persistente viene fatturata a token e il contesto accumulato viene riprocessato nei turn successivi. All'aumentare della conversazione, aumenta quindi il costo di ogni turno; il contesto audio nativo contribuisce a questa crescita.

Fonte primaria: Gemini Live API — Best practices

Valutazione. Il KPI corretto per un voice agent non è soltanto prezzo per milione di token:

Cost per successful conversation
 = audio/context tokens
 + reasoning tokens
 + tool calls
 + retries
 + media/network layer

La gestione del contesto diventa quindi anche un problema FinOps.


Azure Hardware Corner: dove far girare davvero un LLM locale

Quando si parla di hosting locale/open-weight su Azure, il primo errore è scegliere la VM partendo dal numero di parametri senza distinguere weight memory, KV cache, runtime overhead, batch size, concurrency e interconnect.

Le famiglie Azure attuali coprono livelli molto differenti. Alcuni esempi ufficialmente documentati:

  • NCasT4_v3: NVIDIA T4 con 16 GB per GPU; famiglia orientata anche a real-time inference e GPU compute general-purpose.
  • NCads H100 v5: 1 o 2 NVIDIA H100 NVL con 94 GB per GPU e fino a 640 GiB di RAM di sistema.
  • ND H100 v5: 8 H100 da 80 GB, NVLink dentro la VM e InfiniBand 400 Gbps per GPU per scale-out.
  • ND H200 v5: 8 H200 da 141 GB per GPU, 4,8 TB/s di memory bandwidth per GPU secondo la documentazione Azure.
  • ND MI300X v5: 8 AMD Instinct MI300X da 192 GB per GPU, con Infinity Fabric intra-node e InfiniBand scale-out.

Fonti primarie:
Azure NCasT4_v3
Azure NCads H100 v5
Azure ND H100 v5
Azure ND H200 v5
Azure ND MI300X v5

Prima approssimazione: memoria dei pesi

Weight memory ≈ parameters × bits-per-weight / 8

Quindi, come ordine di grandezza:

8B @ Q4   ≈  4 GB raw weights
70B @ Q4  ≈ 35 GB raw weights
70B @ FP16 ≈ 140 GB raw weights

Analisi tecnica. Questi sono solo i pesi. Bisogna aggiungere metadata della quantizzazione, allocator, buffer temporanei, graph/runtime e soprattutto KV cache, che cresce con context length, batch e numero di sessioni concorrenti. Dire "70B Q4 entra in 35 GB" è quindi vero solo come stima dei pesi, non come sizing della macchina.

T4 vs H100/H200: non è solo una differenza di TFLOPS

Per piccoli modelli quantizzati e pochi utenti, una GPU da 16 GB può ancora essere una scelta sensata se il modello e il contesto entrano in memoria e il throughput richiesto è modesto. Per modelli più grandi e concurrency elevata, la VRAM e la bandwidth diventano determinanti.

Durante la generazione autoregressiva di token, il decode tende spesso a diventare sensibile alla bandwidth perché ogni step deve leggere grandi quantità di pesi. Il prefill di prompt lunghi ha invece un profilo più compute-intensive. Per questo una GPU non si sceglie soltanto guardando il picco teorico di calcolo.

NC o ND?

Analisi architetturale.

Single-node inference / development
  ↓
NC family spesso più naturale

Very large model / distributed training / scale-out inference
  ↓
ND family
  + NVLink / Infinity Fabric
  + InfiniBand / RDMA

Una ND H200 o MI300X da otto GPU è una piattaforma per workload molto più grandi di un server Ollama mono-utente. Usarla per un 7B Q4 sarebbe tecnicamente possibile ma architetturalmente ed economicamente sproporzionato.

Quantizzazione: risparmiare memoria cambia anche il profilo di calcolo

Q4/Q8 non sono soltanto "compressione". Modificano kernel utilizzabili, conversioni, qualità numerica e compatibilità con il runtime. Il guadagno reale dipende dall'engine: llama.cpp/Ollama, vLLM, TensorRT-LLM, ONNX Runtime o stack ROCm/CUDA possono avere profili molto diversi.

Regola pratica da architect:

1. scegli il modello
2. scegli precisione/quantizzazione
3. definisci context e concurrency
4. stima VRAM + KV cache
5. misura tokens/s e latency
6. solo dopo scegli la VM Azure

Invertire l'ordine — scegliere una GPU e poi chiedersi quale modello farci stare — porta spesso a costi inutili.


DevExpress Watch: nessuna news da forzare, ma il trend Agent Skills è ormai chiaro

Nel feed DevExpress non risultano nuovi post .NET/XAF/Blazor pubblicati nella settimana 14–20 settembre; l'ultimo post mostrato nella sezione latest è del 7 settembre e riguarda Office & PDF File API for Java. Evito quindi di trasformare roadmap già pubblicate in una falsa "novità settimanale".

Fonte primaria: DevExpress Blogs

Resta però significativo il collegamento con le altre sezioni: DevExpress usa già Agent Skills con fallback al Documentation MCP Server, mentre la roadmap XAF v26.2 prevede ulteriori skill prodotto-specifiche e integrazione automatica del MCP documentation server. Non è una notizia della settimana, ma conferma che il pattern Skill + MCP non è confinato a un singolo vendor.

Fonte primaria: DevExpress XAF v26.2 Roadmap


Technical Takeaways

1. L'astrazione non sparisce: viene ottimizzata o resa esplicita

.NET 11 cerca di cancellare il costo delle astrazioni quando il comportamento non è osservabile: task intermedi, allocazioni temporanee, bounds check ridondanti, dispatch indiretti, lookup e buffer diagnostici.

Nel mondo agentico accade quasi il contrario: ciò che prima era implicito nel prompt viene reso esplicito come SKILL.md, schema di tool, approval policy, memory provider e telemetry.

.NET runtime
abstraction → optimize away when safe

Agent architecture
implicit behavior → make explicit and governable

2. Spatial proximity e semantic similarity devono restare concetti separati

La distanza geografica ha un sistema di riferimento, un'unità e una semantica geometrica. La distanza vettoriale è una proprietà di uno spazio appreso. Un sistema serio deve dichiarare come questi due mondi interagiscono, non semplicemente sommarli.

3. Non ogni dominio ha bisogno di un agente

Se un componente possiede autonomia, contesto privato, workflow proprio o model lifecycle indipendente, un specialist agent ha senso. Se possiede soprattutto regole operative e tool deterministici, una skill caricabile + MCP può essere più semplice da osservare e governare.

4. Voice AI sta diventando un problema di scheduling

Con reasoning e tool call asincrone in background, la domanda non è più "quanto ci mette il modello a rispondere?", ma "quali attività devono bloccare la conversazione e quali possono proseguire mentre l'utente continua a interagire?".

5. Per il local inference la GPU va scelta dopo il workload

Parametri, precisione, context, KV cache e concurrency determinano la memoria. Memory bandwidth, runtime e batching determinano il throughput. NVLink/InfiniBand diventano importanti solo quando il problema richiede davvero più GPU o più nodi.


Lab della settimana

Lab 1 — .NET 11 Runtime Async: benchmark + disassembly

Creare un servizio o un benchmark con una catena di 5–10 helper async Task<T> e compilare due versioni:

# versione classica
runtime-async = off

# versione .NET 11
<Features>$(Features);runtime-async=on</Features>

Misurare:

binary size
allocated bytes/op
mean latency
exception path
sync completion
real suspension
JIT disassembly

Obiettivo: non verificare se "runtime async è più veloce", ma capire dove scompaiono task, state machine e boundary intermedi.

Documentazione: Performance Improvements in .NET 11

Lab 2 — ArcGIS: spatial prefilter + semantic reranking

Preparare un feature layer con embeddings e scegliere una feature target.

A. Generate Near Table / Near
   → top N candidati geografici

B. cosine similarity sugli embeddings
   → reranking dei candidati

C. confronto con
   pure semantic nearest neighbors

Visualizzare in mappa tre gruppi:

closest spatially
closest semantically
closest semantically inside spatial constraint

Misurare quanto cambia la risposta e verificare se la scala geografica dell'embedding è coerente con quella delle feature analizzate.

Documentazione: Esri Embeddings in Spatial Analysis — ArcGIS Pro Near

Lab 3 — Experience Builder: Agent Skill locale vs skill distribuita

Costruire lo stesso widget custom in tre modalità:

A. coding agent senza skill
B. coding agent + Esri arcgis-exb-widget-dev skill
C. agent + skill discovery + tool/documentation MCP

Valutare:

manifest correctness
folder structure
API correctness
data-source lifecycle
accessibility
manual fixes
tool calls
model calls
total tokens
elapsed time

Il test interessante non è "l'AI ha generato il widget?". È capire quale architettura produce il minor numero di deviazioni dalle convenzioni SDK e il minor costo di correzione umana.

Documentazione: Esri Experience Builder Agent Skill — Microsoft Distributed Skills over MCP


NicoGIS Tech Weekly seleziona aggiornamenti tecnici supportati da fonti primarie. Le sezioni indicate come “Analisi tecnica”, “Analisi architetturale” o “Valutazione” sono interpretazioni tecniche e non dichiarazioni dei vendor citati.

lunedì 14 settembre 2026

NicoGIS Tech Weekly — 14 settembre 2026 - #2

Agents API, full-duplex voice, .NET 11 RC1, C# 15 nei contratti HTTP, Model Router osservabile e il nuovo confine di sicurezza degli agenti

La settimana dal 7 al 13 settembre 2026 ha un segnale tecnico molto più interessante dell'ennesimo incremento di benchmark: il runtime agentico sta diventando un prodotto di piattaforma. OpenAI espone il proprio harness attraverso una Agents API; GPT-Live-1 separa il front-end conversazionale real-time dal backend di reasoning; Microsoft porta .NET 11 alla prima Release Candidate con licenza go-live e rende union types e closed hierarchies parte concreta dei contratti ASP.NET Core; Foundry Model Router aggiunge affinity e telemetria di routing. Sul lato security, il nuovo threat report di Anthropic mostra perché tool permission, sandbox, identità e audit non sono più dettagli implementativi.


1. OpenAI Agents API: il vero prodotto non è il modello, è l'harness

Fatto verificato. Il 10 settembre OpenAI ha annunciato la Agents API in public beta. L'API porta agli sviluppatori l'harness usato per Codex: gestione del contesto, tool discovery, sessioni lunghe, ambienti di esecuzione e subagent. L'ambiente di calcolo può essere un sandbox gestito da OpenAI, infrastruttura propria oppure un sandbox partner. OpenAI dichiara inoltre che non esiste un costo aggiuntivo per la Agents API in sé: restano i costi dei modelli e dei tool utilizzati.

Analisi tecnica. Il cambio di livello di astrazione è importante. Finora molte implementazioni enterprise costruivano manualmente un agent loop attorno alla Responses API o a un framework esterno. Con la Agents API il confine diventa più simile a questo:

User task
   ↓
Agent session
   ↓
Managed harness
   ├── context compaction
   ├── tool search / MCP
   ├── programmatic tool calls
   ├── subagents
   └── sandbox / files / code
   ↓
Result

OpenAI documenta la compattazione automatica del contesto quando una sessione si avvicina al limite, il caricamento selettivo delle definizioni dei tool e l'esecuzione parallela di subagent. Questi tre elementi incidono direttamente su costo, latenza e affidabilità: evitare di reinviare tutte le tool definition riduce token inutili; isolare i subagent evita di contaminare il contesto principale; la compaction consente workflow che superano una singola context window.

Valutazione. Non leggerei però “public beta” come sinonimo di runtime maturo per qualsiasi workload regolato. La semplificazione dell'orchestrazione sposta il lavoro verso governance, evaluation e security boundary. Il pattern che adotterei è: tool allowlist esplicita, sandbox separato dai sistemi core, identità con least privilege e approval per azioni irreversibili. Più il modello è autonomo, meno deve essere implicito il suo perimetro di autorizzazione.

Fonte primaria: OpenAI — Introducing the Agents API


2. GPT-Live-1: la voce diventa un front-end full-duplex, non una pipeline STT → LLM → TTS

Fatto verificato. Sempre il 10 settembre OpenAI ha reso disponibile via API GPT-Live-1, un modello full-duplex in grado di ascoltare e parlare contemporaneamente. OpenAI lo presenta come front-end vocale che può delegare reasoning più profondo e azioni a un modello backend e ai relativi tool. Il prezzo pubblicato per il layer vocale è 0,05 USD al minuto; i costi del modello backend e dei tool restano separati.

Analisi tecnica. Il punto non è solo la naturalezza. Una pipeline classica ha almeno tre fasi con buffering e handoff:

Audio in
  ↓
Speech-to-Text
  ↓
LLM
  ↓
Text-to-Speech
  ↓
Audio out

Il full-duplex riduce la necessità di orchestrare manualmente turn detection, interruzioni e ripresa del parlato. L'architettura più interessante diventa invece:

Voice client ↔ GPT-Live-1 ↔ backend agent/model ↔ tools

Questo permette di mantenere il canale conversazionale responsivo mentre il backend effettua reasoning o tool call più costosi. In pratica, il modello vocale diventa un interaction runtime, mentre il modello testuale può rimanere il deliberative runtime.

Valutazione. Il KPI corretto non è più il solo prezzo per token. Per un voice agent misurerei costo totale per conversazione, latenza al primo audio, percentuale di interruzioni gestite correttamente, tempo medio dei tool e costo backend per minuto di sessione. Il modello economico reale è: voice minutes + backend tokens + tool calls + telephony + retries.

Fonte primaria: OpenAI — Build more natural voice experiences with GPT-Live-1 in the API


3. .NET 11 RC1: da preview tecnologica a candidato utilizzabile con go-live support

Fatto verificato. Microsoft ha pubblicato .NET 11 Release Candidate 1 l'8 settembre. È la prima RC e viene distribuita con go-live support license. Microsoft indica supporto in Visual Studio 2026 Insiders e in Visual Studio Code con C# Dev Kit. Tra gli elementi evidenziati ufficialmente ci sono supporto JSON per closed-type polymorphism e union, immagini container riproducibili con upload ridondanti evitati, Native AOT reuse per file-based programs, stabilizzazione delle union in C# 15, API finalizzate per il refresh dell'autenticazione SignalR e componenti Blazor sperimentali per UI agentiche.

Analisi tecnica. RC1 è il momento in cui inizierei una vera migration lane, non un semplice progetto demo. La presenza della licenza go-live non significa “aggiorna tutto domani”; significa che ha senso testare workload reali e produrre una matrice di compatibilità con package, serializer, source generator, reflection, Native AOT, SignalR, Blazor e container pipeline.

Due dettagli operativi meritano più attenzione del marketing. Le immagini container riproducibili riducono differenze non intenzionali tra build e possono migliorare caching e supply-chain verification. Il refresh dell'autenticazione SignalR, invece, interviene su un problema reale delle applicazioni long-lived: una connessione può sopravvivere più a lungo dello stato di autenticazione iniziale, quindi allineare circuit/connection lifetime e identity lifetime è un miglioramento architetturale concreto.

Valutazione. Per applicazioni enterprise adotterei RC1 prima in CI e in ambienti non critici, con un gate esplicito sui breaking changes. Il valore di una RC non è “avere prima le feature”, ma scoprire prima incompatibilità che in novembre diventerebbero blocchi di progetto.

Fonte primaria: Microsoft .NET Blog — Announcing .NET 11 Release Candidate 1


4. C# 15 union types + ASP.NET Core: il contratto JSON entra nel type system

Fatto verificato. Il 10 settembre il team .NET ha documentato l'integrazione delle native union di C# 15 e delle closed hierarchies con System.Text.Json e ASP.NET Core. Le union funzionano nei punti in cui ASP.NET Core usa STJ — body JSON, SignalR JsonHubProtocol, Blazor JS interop, persisted component state e parametri prerendered — ma non per query string, route values, header o form fields. Il compilatore conosce i case ammessi e può segnalare switch non esaustivi. Per nuove API in cui si controllano tutte le classi, Microsoft raccomanda in generale una closed hierarchy con discriminator; una union è particolarmente adatta quando bisogna conservare un contratto discriminator-free o combinare tipi non correlati, inclusi primitivi.

Un esempio applicativo può essere modellato senza wrapper custom:

public record OrderCreated(int Id);
public record ValidationError(string Message);
public record Unauthorized();

public union CreateOrderResult(
    OrderCreated,
    ValidationError,
    Unauthorized);

Analisi tecnica. La cosa importante è la propagazione del contratto. Con object o un wrapper proprietario il compilatore non può sapere quali alternative siano realmente valide. Con una union, aggiungere un case può produrre warning nei punti in cui gli switch non sono più esaustivi. È un ottimo meccanismo per codice interno e bounded context, ma introduce anche una forma di coupling intenzionale: evolvere il contratto costringe i consumer fortemente tipizzati a prendere posizione sul nuovo caso.

Per API pubbliche, quindi, la scelta fra union e closed hierarchy non è solo estetica. Il discriminator rende l'evoluzione e la deserializzazione di forme object-shaped più esplicite. Un contratto discriminator-free è più elegante quando deve aderire a JSON preesistente, ma diventa ambiguo se due case hanno shape sovrapposte. Microsoft documenta un classificatore strutturale, ma la classificazione basata sulla shape aggiunge lavoro e può cambiare comportamento quando evolvono le proprietà JSON.

Valutazione. Per nuove API enterprise userei closed hierarchy + discriminator quando controllo il dominio. Riservarei union discriminator-free a primitive alternative, interoperabilità con contratti esterni o casi in cui introdurre un envelope romperebbe compatibilità.

Fonte primaria: Microsoft .NET Blog — Use C# unions and closed hierarchies in ASP.NET Core


5. Microsoft Foundry Model Router: session affinity e routing trace rendono il model routing finalmente osservabile

Fatto verificato. La pagina “What's new in model router” di Microsoft Foundry è stata aggiornata il 10 settembre 2026. Le novità di settembre includono session affinity per Chat Completions in preview, metadata di routing per singola richiesta in preview e l'espansione del Model Router a 32 regioni. Con session affinity un'applicazione può fornire un session ID opaco e chiedere al router di tentare di mantenere lo stesso modello eleggibile fra turn correlati, senza disattivare eligibility e fallback. I nuovi metadata possono esporre serving model, routing mode, routing-trace latency, sequenza dei model attempt, HTTP status ed errori.

Analisi tecnica. Questo risolve due problemi classici dei gateway multi-model. Il primo è la consistency drift: due turn della stessa conversazione possono finire su modelli con comportamento differente. L'affinity non garantisce pinning assoluto — e infatti Microsoft conserva il fallback — ma introduce una preferenza di continuità. Il secondo è l'osservabilità: senza sapere quale modello ha servito la richiesta e quali fallback sono avvenuti, è quasi impossibile spiegare variazioni di costo, latenza o qualità.

Request
   ↓
Model Router
   ├── eligibility
   ├── profile / cost-quality policy
   ├── session affinity
   ├── attempt #1
   └── fallback attempt #2
   ↓
Response + routing metadata

Valutazione. Questo è il passaggio che rende il routing multi-model qualcosa di più di una black box. In produzione registrerei per ogni request almeno modello servente, numero di attempt, fallback reason, routing latency, total latency, token e costo. Solo così si può verificare se il router sta davvero ottimizzando qualità/costo oppure sta introducendo varianza non desiderata.

Fonte primaria: Microsoft Learn — What's new in model router in Microsoft Foundry Models


6. ArcGIS Maps SDK for .NET 200.8.3: il messaggio vero è il passaggio di lifecycle verso 300.x

Fatto verificato. Esri indica attualmente ArcGIS Maps SDK for .NET 200.8.3 come versione corrente, datata settembre 2026. Le release note 200.8.3 riportano, tra le correzioni, un crash aprendo nuove mappe di data-management solution da ArcGIS Enterprise, il deadlock BUG-000183194 durante sync e aggiunta contemporanea di feature, un problema di SubtypeFeatureLayer con ScaleSymbols e Map.ReferenceScale, e l'aggiornamento SQLite a 3.53.1. Esri specifica inoltre che la linea 200.x è ora focalizzata esclusivamente su bug fix e security update e indirizza i nuovi sviluppi verso 300.x. La documentazione non espone il giorno esatto di pubblicazione di 200.8.3, quindi non attribuisco la patch a una data specifica della settimana.

Analisi tecnica. Per un team .NET GIS, la notizia più importante non è il singolo bug fix: è il lifecycle. Una linea che passa in maintenance-only cambia il costo di restare fermi. Il debito non si manifesta subito come incompatibilità, ma come progressiva distanza da runtime, tooling e framework moderni.

Il pattern che userei è una matrice esplicita:

App / modulo
  ↓
ArcGIS Maps SDK 200.8.x
  ↓
.NET target / MAUI / WPF / WinUI
  ↓
Local Server dependency?
  ↓
API deprecate?
  ↓
Migration target: 300.x

Valutazione. Non migrerei “perché 300 è più nuovo”; migrerei perché 200.x ha ormai un contratto di manutenzione chiaro. Per app con sync offline, Utility Network, rendering custom o Local Server, costruirei test di regressione prima della migrazione e separerei i rischi di framework dai rischi GIS.

Fonte primaria: Esri Developer — ArcGIS Maps SDK for .NET 200.8 release notes


7. Anthropic Threat Intelligence: gli agenti abbassano il costo operativo dell'attaccante

Fatto verificato. Il 10 settembre Anthropic ha pubblicato il report Detecting and countering misuse of AI: September 2026, basato su casi di abuso identificati e interrotti tra dicembre 2025 e agosto 2026. Anthropic descrive un'evoluzione dall'uso conversazionale del modello verso esecuzione diretta e orchestrazione, inclusi framework multi-agent che in alcuni casi hanno operato per ore o giorni con supervisione minima. Il report sottolinea anche due caveat: le decisioni più importanti, come target selection e monetizzazione, restano spesso umane; autonomia e severità del danno non sono la stessa cosa.

Analisi tecnica. Va trattato come vendor threat intelligence, non come misura statistica della prevalenza globale del fenomeno. Ma il segnale architetturale è utile: l'autonomia riduce il costo marginale di eseguire task ripetitivi, sia per operatori legittimi sia per attaccanti. Questo modifica il threat model dei sistemi agentici.

Se un agente possiede accesso a shell, cloud control plane, storage, posta o database, il problema non è solo prompt injection. Il blast radius dipende dall'intersezione fra:

Model capability
× Tool surface
× Credential scope
× Network reachability
× Autonomy duration
× Approval policy

Valutazione. Per sistemi aziendali adotterei credenziali per-sessione o workload identity, secret isolation, egress filtering, tool allowlist, audit immutabile e human approval sulle operazioni irreversibili. Un agente non dovrebbe ereditare automaticamente i privilegi dell'amministratore che lo sta testando.

Fonte primaria: Anthropic — Detecting and countering misuse of AI: September 2026


DevExpress Watch

Nella finestra 7–13 settembre non ho trovato un nuovo annuncio DevExpress .NET/XAF/Blazor sufficientemente sostanziale da meritare una voce separata rispetto alle roadmap v26.2 già analizzate. L'ultimo post del sito nella settimana è relativo all'Office & PDF File API per Java. Preferisco quindi non riempire il digest con una voce marginale solo per coprire il brand: quando emergerà un aggiornamento concreto su XAF, Blazor, AI Chat, MCP o .NET 11, tornerà nella selezione.


Technical Takeaways

Il runtime agentico sta diventando una piattaforma. Agents API, full-duplex voice e model routing mostrano che il valore non è più concentrato nel singolo modello. Context management, sandbox, tool search, routing, fallback, identity e osservabilità sono ormai parte della piattaforma applicativa.

Il type system sta entrando nei contratti distribuiti. C# 15 union e closed hierarchies non sono solo sugar sintattico: insieme a System.Text.Json e OpenAPI permettono di descrivere in modo verificabile i possibili shape di una API. Il vantaggio è maggiore sicurezza evolutiva; il costo è un coupling più esplicito, che deve essere progettato.

Observability deve arrivare prima dell'automazione. Un router che sceglie automaticamente modelli e un agente che sceglie automaticamente tool sono utili solo se possiamo ricostruire a posteriori cosa è successo. Serving model, fallback, tool call, identity, approval, latenza e costo devono diventare eventi osservabili, non dettagli nascosti.

Il lifecycle conta quanto le feature. .NET 11 entra in RC con go-live support mentre ArcGIS 200.x entra nella fase bug-fix/security-only. In entrambi i casi il lavoro da fare non è inseguire la versione più nuova, ma mantenere una compatibility matrix e pianificare la migrazione prima che diventi emergenza.


Lab della settimana

Lab 1 — C# 15 contract evolution test

Con .NET 11 RC1 crea una Minimal API che restituisce una union con tre case. Genera OpenAPI, serializza ogni case con System.Text.Json e poi aggiungi un quarto case. Verifica quali switch producono warning e come cambia lo schema OpenAPI. Ripeti con una closed hierarchy + discriminator e confronta leggibilità del JSON, compatibilità e comportamento dei client generati.

Documentazione: C# unions and closed hierarchies in ASP.NET Core

Lab 2 — Model Router observability

Su un deployment Microsoft Foundry Model Router abilita i metadata preview per Chat Completions e invia una serie di prompt eterogenei. Registra serving model, routing latency, model attempts, fallback, total latency e token. Poi raggruppa i risultati per task type. Lo scopo non è trovare “il modello migliore”, ma capire se il router riduce il costo medio per task senza degradare il success rate.

Documentazione: Microsoft Foundry Model Router — What's new

Lab 3 — Managed harness vs agent loop custom

Implementa lo stesso task multi-step in due modi: una pipeline custom con Responses API/tool calling e una sessione Agents API con lo stesso set di tool. Misura numero di model call, token totali, tool call, latency, error recovery e quantità di codice infrastrutturale. Aggiungi un task abbastanza lungo da forzare gestione del contesto. Il test interessante non è solo la qualità finale, ma quanto orchestration code e quanta state management vengono realmente eliminati.

Documentazione: OpenAI Agents API


NicoGIS Tech Weekly seleziona solo aggiornamenti con fonti primarie verificabili. Le sezioni indicate come “Analisi tecnica” o “Valutazione” sono interpretazioni architetturali e non affermazioni dei vendor citati.

lunedì 7 settembre 2026

NicoGIS Tech Weekly — 7 settembre 2026 - #1

Agentic AI, C# 15, Native AOT, Azure AI Search, ArcGIS Pro e DevExpress v26.2

La settimana tra il 31 agosto e il 6 settembre 2026 ha un filo conduttore abbastanza evidente: stiamo passando dalla fase in cui l'AI veniva integrata come semplice endpoint generativo alla costruzione di runtime agentici veri e propri, con strumenti, isolamento, retrieval governato, autorizzazioni e osservabilità.

Parallelamente anche gli stack tradizionali stanno cambiando. C# introduce costrutti che portano più informazioni nel type system, .NET cerca di rendere i test coerenti con il deployment Native AOT, Azure AI Search sta diventando sempre più un vero knowledge runtime per agenti, mentre Esri e DevExpress stanno rendendo più prevedibili e strutturati i rispettivi cicli evolutivi.


GPT-6 Astra: il modello diventa un runtime per task end-to-end

OpenAI ha annunciato GPT-6 Astra il 3 settembre 2026. Il modello viene distribuito tramite API come gpt-6-astra e supporta sia la Responses API sia Chat Completions. OpenAI lo presenta come un modello orientato a coding, ricerca, computer use e attività complesse multi-step.

La tariffazione Standard pubblicata da OpenAI è di 10 dollari per milione di token di input e 50 dollari per milione di token di output.

Analisi tecnica. Il dato più interessante non è semplicemente che Astra sia "più intelligente". La vera evoluzione è l'accorpamento nello stesso modello di reasoning, coding, browsing, computer interaction e utilizzo di strumenti.

Questo riduce potenzialmente la necessità di pipeline molto frammentate:

planner
   ↓
coding model
   ↓
browser model
   ↓
executor
   ↓
synthesizer

a favore di architetture più compatte:

orchestrator
   ↓
GPT-6 Astra
   ↓
tools / MCP / browser / computer / files

Non significa però che convenga utilizzare il modello più potente per qualsiasi richiesta. In un'architettura enterprise ha molto più senso introdurre model routing: task semplici, classificazione, extraction e RAG elementare possono essere indirizzati verso modelli meno costosi, riservando il modello frontier ai task realmente complessi.

OpenAI ha inoltre dichiarato che GPT-6 Astra è il primo proprio modello a raggiungere il livello Critical per le capacità cyber secondo il Preparedness Framework. Da un punto di vista architetturale questo rafforza un principio importante: un agente più capace deve avere meno privilegi impliciti, non più privilegi.

Tool authorization, approval gates, identity propagation, least privilege e auditing non possono quindi essere considerati semplici elementi UX: diventano parte dell'architettura applicativa.

Fonti ufficiali:
OpenAI — GPT-6 Astra: A new generation of intelligence
OpenAI — Release Notes
OpenAI — Safety overview: GPT-6 Astra


Gemini 3.8 Flash: il vero benchmark diventa capability/costo per task

Google ha presentato Gemini 3.8 Flash il 2 settembre 2026, insieme a Gemini 3.8 Flash Cyber. Google posiziona 3.8 Flash come modello destinato in particolare a software engineering, agentic task e reasoning multi-step.

Il prezzo introduttivo indicato da Google è di 0,75 dollari per milione di token di input e 3,75 dollari per milione di token di output.

Analisi tecnica. Con gli agenti il confronto basato esclusivamente sul costo per milione di token diventa sempre meno significativo.

TotalTaskCost =
    ModelInputTokens
  + ModelOutputTokens
  + ReasoningOverhead
  + Retrieval
  + ToolCalls
  + Retries
  + ExecutionTime

Un modello nominalmente economico che richiede molti cicli agentici può risultare più costoso di un modello più caro che conclude correttamente il task in pochi step.

Nei benchmark interni inizierei quindi a misurare almeno:

  • Task Success Rate
  • token totali consumati per task
  • numero medio di tool call
  • numero di retry
  • wall-clock latency
  • costo medio per task completato

Questo è particolarmente importante perché stiamo passando dal benchmark del modello al benchmark dell'intero agent runtime.

Google ha inoltre introdotto Gemini 3.8 Flash Cyber all'interno di un programma a disponibilità limitata per scenari avanzati di cyber defense, ulteriore segnale della progressiva specializzazione dei modelli e delle relative policy di accesso.

Fonte ufficiale:
Google — Introducing Gemini 3.8 Flash and 3.8 Flash Cyber


C# 15: Union Types e Closed Hierarchies cambiano il domain modeling

Microsoft ha reso disponibili in .NET 11 Preview 7 diverse funzionalità previste per C# 15, tra cui Union Types, Closed Hierarchies, una nuova preview del modello unsafe, collection-expression arguments, extension indexers e labeled break/continue.

Una delle novità più interessanti è la possibilità di modellare direttamente un insieme chiuso di tipi:

public record Success(string Value);
public record Failure(string Error);

public union Result(Success, Failure);

Il compilatore conosce i casi che compongono l'unione e può quindi aiutare nella verifica dell'exhaustiveness durante il pattern matching.

Analisi tecnica. Questo può eliminare una quantità non trascurabile di codice infrastrutturale che oggi implementiamo tramite:

object
marker interfaces
abstract base classes
custom Result<T>
manual discriminators
OneOf-like libraries

Un domain result può diventare concettualmente:

CreateOrderResult
    ├── OrderCreated
    ├── ValidationError
    └── CreditRejected

Il vantaggio non è soltanto sintattico. Una nuova variante può rendere non esaustivo uno switch esistente, spostando il controllo da una convenzione progettuale a un vincolo verificato dal type system.

Le Closed Hierarchies seguono la stessa direzione: rendere esplicito quali tipi possono appartenere a una gerarchia invece di affidarsi esclusivamente alla disciplina dello sviluppatore.

Questa evoluzione rende C# decisamente più interessante per domain modeling, state machine, workflow e API che devono rappresentare esplicitamente un insieme finito di risultati.

Fonti ufficiali:
Microsoft .NET Blog — Explore new features available in C# 15 preview
Microsoft .NET Blog — Explore union types in C# 15


MSTest 4.4 + Native AOT: finalmente si può testare il deployment model reale

Microsoft ha documentato con MSTest 4.4 la possibilità di pubblicare ed eseguire progetti di test come executable Native AOT.

Il punto tecnico è importante: Native AOT esegue compilazione ahead-of-time e trimming, per cui un'applicazione pubblicata può comportarsi diversamente dallo stesso codice eseguito normalmente sotto runtime managed.

Una configurazione di base è:

<Project Sdk="MSTest.Sdk/4.4.0">
  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
    <PublishAot>true</PublishAot>
  </PropertyGroup>
</Project>

e quindi:

dotnet publish MyProject.Tests.csproj -c Release -r win-x64

MSTest utilizza source generation per registrare preventivamente test class e modalità di invocazione, prima che il trimming elimini metadata apparentemente non necessari.

Analisi tecnica. Questo risolve una differenza reale tra:

code tested under JIT/runtime reflection

e:

actual trimmed + AOT compiled artifact

Il caso classico riguarda reflection, serializer, dependency injection dinamica, plugin discovery o altri pattern che dipendono da metadata disponibili a runtime.

Non sostituirei comunque i test managed tradizionali. Una pipeline più sensata è:

Pull Request
   └── Managed tests
       └── feedback rapido

Release validation
   ├── Managed tests
   ├── Native AOT tests
   └── End-to-end test dell'artifact pubblicato

In questo modo il costo del publish AOT non rallenta necessariamente ogni singolo ciclo di sviluppo, ma viene utilizzato dove serve realmente: nella validazione dell'artifact destinato alla produzione.

Fonte ufficiale:
Microsoft .NET Blog — Test what you ship: MSTest and Native AOT


Azure AI Search 2026-08-01-preview: da vector search a knowledge runtime

Microsoft ha introdotto la REST API preview 2026-08-01-preview per Azure AI Search. Tra le funzionalità documentate figurano supporto private network per indexed knowledge source, default configurabili nelle knowledge base, controllo del reranking per singola sorgente, streaming dei risultati di retrieve e citation URL per indexed knowledge source.

Per esempio, il controllo:

"resultsProcessing": "none"

permette di bypassare il reranking per una knowledge source e mantenere l'ordinamento prodotto dalla sorgente sottostante.

Analisi tecnica. L'evoluzione interessante è concettuale.

Il modello tradizionale era:

User Query
    ↓
Embedding
    ↓
Vector Search
    ↓
Top K Documents
    ↓
LLM

Il modello verso cui Azure AI Search si sta muovendo è più vicino a:

User Query
    ↓
Knowledge Base
    ↓
Query Planning
    ↓
Knowledge Source Selection
    ↓
Permissions / Filters
    ↓
Retrieval
    ↓
Per-source Processing
    ↓
Reranking
    ↓
Answer / Grounding / Citations

Questa è una differenza importante: Azure AI Search non viene più utilizzato esclusivamente come vector database o motore di semantic search, ma tende a diventare un retrieval orchestration layer.

Particolarmente rilevante in ambito enterprise è il supporto private network per knowledge source indicizzate basate, tra le altre, su Blob, SharePoint e Azure SQL.

Per sistemi RAG aziendali, caratteristiche come networking, permission filtering, citation provenance e governance possono essere molto più importanti di qualche punto percentuale guadagnato su un benchmark di retrieval.

Va comunque ricordato che queste funzionalità appartengono a una API preview. Microsoft avverte inoltre che l'utilizzo di servizi Microsoft o di terze parti collegati può comportare data processing o storage al di fuori dell'Azure compliance boundary.

Quindi: interessante tecnologicamente, ma da sottoporre a una vera data-flow e governance review prima di utilizzarlo su dati sensibili.

Fonti ufficiali:
Microsoft Learn — What's New in Azure AI Search
Microsoft Learn — Azure AI Search REST API Versions


ArcGIS Pro 3.8: STS/LTS cambia la strategia di upgrade enterprise

Esri ha annunciato un cambio significativo al lifecycle di ArcGIS Pro a partire da ArcGIS Pro 3.8.

Il nuovo modello distingue tra release Short-Term Support (STS) e Long-Term Support (LTS).

Secondo Esri, le release LTS saranno supportate per circa due anni, mentre le STS per circa un anno.

Analisi tecnica. Questa modifica è molto più importante per le installazioni enterprise di quanto possa sembrare.

In ambienti GIS complessi una release ArcGIS Pro non vive isolatamente. La matrice reale comprende spesso:

ArcGIS Pro
   ↕
ArcGIS Enterprise
   ↕
Enterprise Geodatabase
   ↕
DBMS / Client Drivers
   ↕
ArcGIS Pro SDK Add-ins
   ↕
Citrix / RDS
   ↕
Python environments
   ↕
Business extensions

Per organizzazioni che devono validare tutto questo stack, aggiornare ogni release può essere costoso e rischioso.

Il pattern più naturale diventa quindi:

Innovation / Early Adoption
          ↓
        STS

Enterprise Baseline
          ↓
        LTS

Questo consente di distinguere molto meglio una release destinata a provare rapidamente nuove capability da quella utilizzata come baseline aziendale stabile.

Per chi sviluppa ArcGIS Pro Add-in, una conseguenza positiva potrebbe essere una test matrix più razionale: LTS come baseline stabile e STS utilizzata per verificare anticipatamente compatibilità e nuove API.

Fonte ufficiale:
Esri — Update to ArcGIS Pro Product Life Cycle


DevExpress v26.2: Blazor e XAF entrano in una fase più enterprise

DevExpress ha pubblicato le roadmap di fine 2026 per Blazor v26.2 e XAF v26.2, entrambe previste per dicembre 2026.

Per Blazor sono previste, tra le altre cose, supporto .NET 11, innalzamento a .NET 10 della versione minima supportata con v26.2, supporto RTL in CTP, release ufficiale della nuova Icon Library, nuove fondamenta di styling basate su CSS variable e diverse evoluzioni del componente AI Chat.

La roadmap documenta in particolare una funzionalità interessante per gli agenti: tool approval visualization.

L'AI Chat potrà presentare all'utente una UI di conferma prima dell'esecuzione di una tool call, ad esempio prima di aggiornare un record CRM o inviare un'email.

Analisi tecnica. Questo è un dettaglio importante perché sposta lo Human-in-the-Loop da implementazione custom a pattern supportato direttamente dal componente UI.

LLM
 ↓
Tool Call Request
 ↓
DevExpress AI Chat
 ↓
Human Approval
 ↓
Execute / Reject

È esattamente il pattern che serve quando un sistema AI passa dalla sola generazione di testo all'esecuzione di azioni con effetti reali.

Sul fronte XAF, DevExpress continua inoltre a lavorare sulla scalabilità Blazor, dichiarando test specifici per scenari Crowd/Peak Load, Activity e Requests Per Second, oltre a ottimizzazioni su XAF Core, consumo di memoria e rendering Blazor.

Questo è probabilmente uno dei fronti più interessanti per chi utilizza XAF in applicazioni aziendali con numerosi utenti concorrenti.

Con XAF, infatti, il punto centrale non è soltanto aggiungere una chat AI. L'architettura realmente interessante è:

XAF Security System
        ↓
Application User Context
        ↓
AI / Agent Layer
        ↓
Tools / RAG / MCP
        ↓
Business Objects
        ↓
Database / Services

La sfida enterprise sarà fare in modo che retrieval e tool invocation rispettino lo stesso security model applicato all'interfaccia XAF: object-level security, member-level security, ruoli, tenant e autorizzazioni.

Una chat integrata è semplice. Un agente che non possa oltrepassare i privilegi dell'utente è invece una caratteristica architetturale.

La roadmap XAF v26.2 merita inoltre attenzione per la parte scalability: DevExpress dichiara esplicitamente l'intenzione di pubblicare condizioni di test, configurazioni, risultati, limitazioni e metriche relative a concorrenza e carico.

Fonti ufficiali:
DevExpress — Blazor Year-End 2026 Roadmap v26.2
DevExpress — XAF Year-End Roadmap v26.2


Technical Takeaways

Questa settimana evidenzia almeno tre tendenze strutturali.

1. Il modello non è più l'architettura AI

GPT-6 Astra e Gemini 3.8 continuano ad aumentare le capability del modello, ma un sistema enterprise ha bisogno di molti altri componenti:

Identity
Authorization
Model Routing
Tools
MCP
Retrieval
Knowledge Sources
Observability
Auditing
Human Approval
Cost Governance

Il modello deve possibilmente rimanere un componente sostituibile dell'architettura, non diventare l'architettura stessa.

2. Sempre più regole vengono trasformate in vincoli espliciti

C# porta insiemi chiusi di alternative dentro il type system. Azure AI Search porta knowledge source, processing e retrieval policy nella configurazione. Le UI AI iniziano a incorporare esplicitamente approval e controllo dell'esecuzione.

Ogni volta che una regola passa da:

"il developer deve ricordarsene"

a:

"la piattaforma può verificarla o applicarla"

l'architettura diventa più robusta.

3. Deployment e produzione stanno tornando al centro

MSTest Native AOT testa ciò che viene realmente pubblicato. ArcGIS introduce un lifecycle più facilmente gestibile in ambiente enterprise. DevExpress parla apertamente di concurrency, peak load, RPS e memory usage.

È un'evoluzione positiva: meno demo tecnologiche e più production engineering.


Lab della settimana

Lab 1 — Native AOT Test Pipeline

Prendere un progetto .NET reale che utilizza System.Text.Json, dependency injection e qualche componente basato su reflection.

Eseguire prima:

dotnet test

e successivamente una pipeline separata:

dotnet publish -c Release -r win-x64

con PublishAot=true, verificando che numero di test e comportamento coincidano con l'esecuzione managed.

Documentazione: MSTest and Native AOT

Lab 2 — Domain Modeling con C# 15 Union Types

Creare un risultato applicativo:

public record OrderCreated(int Id);
public record ValidationError(string Message);
public record Unauthorized();

public union CreateOrderResult(
    OrderCreated,
    ValidationError,
    Unauthorized);

e utilizzare pattern matching esaustivo per trasformarlo in una risposta HTTP o in un risultato applicativo.

Documentazione: C# 15 Union Types

Lab 3 — Azure AI Search come Retrieval Orchestrator

Creare una knowledge base utilizzando la REST API 2026-08-01-preview e confrontare il comportamento con una pipeline RAG tradizionale.

Misurare almeno:

  • latency end-to-end;
  • numero di query eseguite;
  • qualità del grounding;
  • precisione delle citazioni;
  • token consumati;
  • costo per query;
  • comportamento con permission filtering.

Documentazione: Azure AI Search — What's New


NicoGIS Tech Weekly è una selezione tecnica delle novità che possono avere un impatto concreto su sviluppo software, architetture enterprise, cloud, GIS e applicazioni AI. I fatti sono collegati alle fonti originali; le considerazioni indicate come analisi rappresentano una valutazione tecnica delle possibili implicazioni architetturali.