
Cybersecurity
Consulenza CISO-as-a-service: postura, roadmap di remediation, supporto continuativo.
Scopri →
Servizi & Sistemi Linux
Domini, hosting, PEC, infrastruttura email, servizi di rete e sistemi Linux. Assistenza e gestione dell'infrastruttura Open Source.
Scopri →Il repository deepseek-ai/deepseek-harness è stato creato il 13 agosto 2026 alle 11:56 UTC, in TypeScript, con licenza MIT. Alla lettura del 16 agosto, ore 12:48 CEST, l’API GitHub riporta 124.089 stelle e 12.288 fork.
Harness sta fra un modello e gli strumenti, i file e l’ambiente su cui un agente lavora, che è il posto di cui abbiamo scritto parlando di harness engineering e delle forme da dare a un ciclo. La parte interessante è come è costruito.
La tabella che dichiara il ruolo di ogni servizio
Il documento docs/capability-seams.md elenca 56 righe di servizio e per ognuna dichiara un ruolo: 26 sono marcate seam, cioè punti di estensione previsti, 29 sono marcate core, e una, ctx.agentLoop, è marcata bundle.
Un runtime estendibile che pubblica l’elenco dei propri punti di estensione, riga per riga e con il ruolo accanto, dice a chi lo valuta dove può intervenire senza doverlo scoprire leggendo il codice. È il documento da aprire per primo.
Fra le righe core ci sono ctx.sessions, il log append-only delle sessioni, ctx.agents, il registro e la fabbrica degli agenti, e ctx.tools, il registro e la pipeline di esecuzione degli strumenti. Fra le seam, ctx.llm ha già più implementazioni in albero, fra cui llm-deepseek e llm-pi-ai.
Il progetto è costruito su Cordis, un framework a servizi e plugin che esisteva prima di Harness e che sta nel repository come sottoalbero vendored. docs/architecture.md descrive il modello a riga 13: “you extend dsh by mounting a plugin beside the others, and registrations are effects that unwind when their plugin unloads”.
Quella seconda metà è la parte che conta in esercizio: le registrazioni di un plugin sono effetti che si disfano quando il plugin viene scaricato. Un runtime che carica e scarica componenti a caldo senza lasciare registrazioni orfane risolve un problema che di solito si scopre tardi.
Il loop dell’agente è una riga di configurazione
Il bundle base porta un cordis.patch.yml di 451 righe con un solo blocco - insert:, e alle righe 436-439 dichiara la voce - id: agent-loop con il pacchetto che la implementa.
Sostituire il ciclo di un agente significa quindi cambiare una riga in un file di configurazione, senza toccare il resto del runtime. Per chi ha provato a cambiare la strategia di un agente dentro un framework che il ciclo lo tiene nel proprio nucleo, è una differenza di lavoro sostanziale.
Il meccanismo che applica le patch ha due rami, inserimento e sovrascrittura per id. Su una riga esistente le azioni sono sei, nominate nell’interfaccia PatchOptions: config, disabled, inject, intercept, isolate e group. Averle nominate, invece di lasciare la sostituzione a una convenzione, rende leggibile dal file di configurazione cosa succede a un componente.
Interoperabilità nelle due direzioni
Su MCP, Harness fa da client, quindi consuma server esistenti.
Nella direzione opposta il repository porta packages/acp, un server che espone gli agenti di Harness a client programmatici via Agent Client Protocol. La documentazione lo qualifica come “an interoperability transport, not a presentation layer”, con due trasporti ammessi, stdio e streamable-http. I nomi dei server sono vincolati a [A-Za-z0-9_-]{1,32} e quelli pubblici sono normalizzati a 64 caratteri, con un hash deterministico di 12 esadecimali in caso di collisione.
Un runtime che è client di un protocollo e server di un altro si incastra in una toolchain esistente da entrambi i lati.
Il launcher Landlock
Sotto native/landlock-run il progetto include un launcher nativo basato su Landlock, il modulo di sicurezza del kernel Linux che permette a un processo di restringere da sé i propri accessi al filesystem e alla rete, senza privilegi di root. Ha licenza BSD 3-Clause, distinta dalla MIT del resto.
Per un runtime che esegue strumenti e plugin, avere in casa il pezzo che confina un processo è materiale utile: il confinamento resta una cosa da configurare, ma il mattone c’è e non va cercato altrove.
Accanto a quelli che già esistono
OpenHands è MIT, con 84.167 stelle sul repository principale e un SDK separato in Python, la cui classe base AgentBase dichiara nella docstring: “Agents are stateless and should be fully defined by their configuration”.
Aider è Apache-2.0, con 48.260 stelle, e sceglie l’implementazione scorrendo coders.__all__ dentro Coder.create. Nel package aider/ la stringa mcp compare zero volte.
Il tratto che distingue Harness è dove sta la sostituibilità: non in una gerarchia di classi da estendere, ma in righe di un file di configurazione con azioni nominate, su un insieme di giunture dichiarato in un documento.
Cosa serve per provarlo
Il baseURL è configurabile, sia su llm-deepseek, che punta di default a https://api.deepseek.com, sia per rotta su llm-pi-ai, e la scoperta dei modelli passa da una GET /models in formato compatibile OpenAI. Un endpoint compatibile si può quindi indirizzare.
Nel repository non c’è un percorso di esecuzione locale: una ricerca su tutti i file tracciati per ollama, vllm, sglang, llama.cpp e gguf restituisce zero occorrenze.
I prezzi dell’API DeepSeek alla lettura del 16 agosto, per milione di token: flash a 0,0028 $ con cache hit, 0,14 $ con cache miss e 0,28 $ in output; pro a 0,003625 $, 0,435 $ e 0,87 $.
Quello che vedremo
È una developer preview di tre giorni, e alcune cose si giudicheranno più avanti.
Il repository al 16 agosto non ha tag né release, e la 0.1.0-rc.6 pubblicata su npm non ha un commit corrispondente nella storia pubblica, che si ferma a rc.5. Per una prova su una macchina di sviluppo non cambia niente, e vedremo con quale schema di versionamento il progetto arriverà a una release stabile.
I plugin si installano da un riferimento GitHub risolto da pnpm, come documenta la sezione Plugin management del riferimento della CLI, che annota “pnpm must be on PATH”. Un registro, una firma o una allowlist non sono documentati al momento, e sarà una delle scelte più informative dei prossimi mesi. Fino ad allora un plugin si tratta come qualsiasi altra dipendenza, con revisione, pinning e un ambiente confinato.
Resta da vedere quante delle 29 righe core diventeranno seam, e quali resteranno dove sono. La risposta dirà quanto la formula del progetto vale come principio e quanto come descrizione di questa versione.
