TEKSISTEMI // NEWSLETTER TECNICA ← Archivio 008 · CLAUSTRUM ITEN tty1 · online

Teksistemi · Newsletter tecnica · numero 008 · 12 settembre 2026

$

Una squadra divisa fra Claude, Cursor, opencode e Copilot. Una pipeline di agenti che funzionava solo dentro uno di quei quattro. E un conto della spesa che diceva di smettere di scegliere il modello per fornitore.

Questo numero racconta il bisogno, poi lo strumento nato per rispondergli: un nucleo, due porte, qualunque harness.

Frecce ← → per navigare · m apre l'indice · tocco laterale su mobile

orlodax@tks:~/claustrum$ cat team.txt

Quattro harness, una disciplina — e la disciplina vive in uno solo

PersonaHarnessModelli
DarioClaude Code, desktop app, opencodeFable / Opus / Sonnet + OpenRouter
collega ACursorquel che Cursor offre
collega Bopencode soltantoDeepSeek via OpenRouter
collega CCopilot CLI, VS CodeCopilot

Nessuno è nel torto: ogni scelta è un abbonamento, un'abitudine, un cliente che impone lo strumento.

 architetto
     │  progetta, delega, triagia
     ▼
 builder ×N ──► revisore cieco ‖ ui-reviewer
                      │  vede solo task + diff
                      ▼
                   tester

Ordine fisso, revisione alla cieca, report onesto del builder: tre regole che in un mese ci hanno risparmiato più di quanto siano costate.

Il problema: la delega è il tool Agent di Claude Code, e i ruoli sono file in formato Claude. Fuori da lì, la pipeline non esiste.

Chi è su Cursor lavora bene, ma da solo. Chi è su opencode ha il modello più economico del mercato e nessuna revisione cieca. La disciplina è di uno, non della squadra — e una disciplina di uno non è una disciplina.

orlodax@tks:~/claustrum$ ./cost --per-solved-task --with-cleanup

I token economici smettono di essere economici a diciotto minuti

$0$9$18$27$36 $0$10$20$30$40 costo umano di pulizia per run fallito (c) $6.75 — Sonnet 5 passa in testa $17.60 — Opus 5 passa in testa DeepSeek V4 Pro Claude Sonnet 5 Claude Opus 5
// costo per task risolto, c = pulizia umana per fallimento
Opus 5    = 8.67 + 0.45·c
Sonnet 5  = 3.78 + 0.58·c
V4 Pro    = 2.16 + 0.82·c

// pareggio Opus ↔ V4 Pro
c ≈ $17.60  ≈ 18 min a 60 €/h

Sul solo prezzo dei token DeepSeek vince per quattro a uno. Ma un run fallito non costa solo il retry: costa una persona che capisce cosa è andato storto. Sopra i diciotto minuti di triage, il modello caro è quello che costa meno.

Tassi di successo da SWE-bench Pro (V4 Pro 55,4 % · Sonnet 5 63,2 % · Opus 69,2 %). I volumi di token sono ipotesi da sostituire con misure. Analisi completa: nota interna «Claude vs DeepSeek», settembre 2026.

orlodax@tks:~/claustrum$ route --by role # non --by vendor

L'errore si propaga in modo asimmetrico: instradare per ruolo

ArchitettoUn piano sbagliato lo ereditano tutti i builder a valle; non si recupera senza rifare tutto. Pochi token, premio economico in assoluto.
Opus 5
Revisore ciecoDeve essere più capace di ciò che revisiona, o timbra. Mai un modello più economico di quello che ha scritto il codice.
Opus 5 / Sonnet 5
Builder ×NAlto volume, output verificato a valle, errori contenuti localmente. È qui che l'instradamento paga.
Sonnet 5 · DeepSeek V4
TesterOutput controllabile meccanicamente, il volume più alto di tutti. Vince il modello più economico che ce la fa.
V4 Flash

Mettere il modello economico nel posto del revisore. Un revisore meno capace del builder produce approvazioni sicure di lavoro rotto: trasforma il livello di verifica in un generatore di fluenza, e il registro mostrerà un tasso di divergenza in calo che significa l'opposto di ciò che sembra.

Da qui la conclusione della nota: ibrido, instradato per ruolo. Cattura circa l'80 % del risparmio disponibile e tiene i ruoli con errore irrecuperabile sul modello capace.

Ed è qui che il conto si scontra con la squadra: instradare per ruolo richiede che un solo direttore possa parlare a tutti i modelli, da qualunque podio stia dirigendo.

orlodax@tks:~/claustrum$ diff desiderio realtà

Il capitolato, prima di scrivere una riga

  • Funzionare da qualunque posto: app desktop di Claude, VS Code, Cursor, e le CLI — Claude Code, opencode, Copilot CLI.
  • Delegare a qualunque backend: Claude, DeepSeek via opencode/OpenRouter, Cursor, Copilot, o una chiamata API nuda.
  • Conservare le tre regole: revisione cieca, report onesto, ordine fisso.
  • Un tetto di spesa — disattivabile.
  • N builder in parallelo senza che si calpestino.
  • Essere un plugin per un IDE. Ne servirebbero quattro, e resterebbero indietro.
  • Fidarsi della disciplina del prompt. Ciò che conta si impone, non si chiede.
  • Tradurre percorsi fra Windows e WSL. Ogni copia lancia i backend del proprio sistema.
  • Essere una macchina a stati in C#. Il pipeline è il prompt dell'architetto.

Ogni host dell'elenco — desktop, IDE, CLI — offre a un agente in chat esattamente due ganci universali: un tool di shell e MCP. Nient'altro è comune a tutti. Quindi lo strumento ha due porte, e nient'altro.

orlodax@tks:~/claustrum$ man claustrum

Claustrum — delega di agenti indipendente dall'harness

Un «architetto» in qualunque host delega build, revisioni e test ad agenti che girano su qualunque altro harness e modello, e riceve indietro un solo risultato normalizzato.

Il nome viene da una lamina sottile di neuroni sotto la corteccia, connessa a quasi ogni regione del cervello. Nel loro ultimo lavoro insieme, Crick e Koch la proposero come il direttore d'orchestra che lega le aree specializzate in un unico atto coerente. È esattamente il lavoro: non suona nessuno strumento, fa suonare gli altri insieme.

Crick & Koch, «What is the function of the claustrum?», Phil. Trans. R. Soc. B, 2005.

claustrum run <ruolo> --brief-file <md> [--cast <nome>] [--json]
claustrum cast new | questions | create | list | use
claustrum coordinate --cast <nome> --issues 12,13
claustrum sync [--only claude,opencode] [--global] [--check]
claustrum backends list | doctor
claustrum jobs list | show | logs | clean
claustrum mcp                      # server MCP su stdio

Binario singolo, .NET 10 NativeAOT: Windows, macOS, Linux.
Nessun runtime da installare. ~3 MB.

orlodax@tks:~/claustrum$ claustrum --help | head

Come gli si parla: due porte, una stanza sola

Qualunque assistente con cui state chattando sa fare due cose, sempre: eseguire un comando nel terminale, e usare uno strumento tramite MCP — la presa standard con cui un assistente aggancia programmi esterni. Claustrum si offre in entrambi i modi. Da qualunque porta si entri, si finisce nella stessa stanza.

   voi, in chat ─────► «delega questo a un builder economico»
                                     │
                 ┌───────────────────┴───────────────────┐
                 │ porta 1: un comando     porta 2: uno strumento MCP │
                 └───────────────────┬───────────────────┘
                                     ▼
                              [ claustrum ]
             prepara · fotografa · lancia · rifotografa · legge il rapporto
                                     ▼
                          una ricevuta, sempre uguale

L'assistente scrive una riga nel terminale e aspetta che finisca. Funziona in ogni host già oggi, senza installare nulla nell'IDE.

L'assistente chiama delegate come chiamerebbe una calcolatrice. Più comodo, ma dipende dall'host che sappia parlare MCP — e ormai lo sanno tutti.

  • prepara le istruzioni per l'agente delegato: chi è, cosa può toccare, come deve riferire
  • fotografa il repository con git
  • lancia l'agente sull'harness scelto e aspetta
  • rifotografa: la differenza è ciò che ha cambiato davvero
  • legge il rapporto finale e consegna la ricevuta

orlodax@tks:~/claustrum$ claustrum run builder --brief-file ordine.md

Cosa si dà, cosa si riceve: l'ordine di lavoro e la ricevuta

Come il foglio che si lascia a un artigiano. Quattro voci fisse, sempre le stesse:

Compitole parole di chi lo chiede, tali e quali
Perimetroquali cartelle e file può toccare
Non romperecosa deve continuare a funzionare
Le modifichecome vederle, per chi dovrà giudicarle

Chi ha scritto il piano può aggiungere una voce «Contesto». Il revisore cieco, no: la sua copia dell'ordine non ha quella riga, per costruzione.

RICEVUTA · lavoro 20260912-1403
esito ............ riuscito
chi .............. builder su DeepSeek V4 Flash, via opencode
file cambiati .... 2    ← lo dice git, non l'agente
   + Backends/OpencodeBackend.cs
   ~ Backends/Registry.cs
rapporto dell'agente
   cosa ho fatto ...... aggiunto il backend opencode
   da testare ......... la lettura degli eventi JSONL
   deciso da solo ..... niente, il foglio bastava
   traballante ........ i nomi degli eventi non sono confermati
costo ............ $0.012 · 41 s

In realtà è JSON, per le macchine. Questa è la traduzione — ma le voci sono esattamente quelle.

Due dettagli fanno la differenza. «File cambiati» lo dice git, fotografando prima e dopo: l'agente non può dimenticarsene, né inventarli. E il rapporto ha quattro righe obbligatorie — l'ultima, «traballante», è quella che nessuno scriverebbe spontaneamente ed è quella che vale di più: è lì che chi coordina guarda per prima.

orlodax@tks:~/claustrum$ /claustrum # in qualunque chat

Il cast: chi recita quale ruolo, deciso una volta

Si dice «usa claustrum per coordinare le issue 12 e 13 con un architetto Opus, tre builder DeepSeek, revisione Opus, tester Flash», oppure semplicemente /claustrum. In entrambi i casi lo strumento fa sette domande, sempre le stesse, in qualunque host:

  • architetto: host (sei tu) oppure spawnato su…
  • builder: modello + max in parallelo
  • revisore del codice · revisore UI · tester — o «non serve»
  • tetto di spesa — o «nessun tetto»

Se vivessero nel prompt di ogni harness, derivano e ognuno le formula a modo suo. claustrum cast questions --json le restituisce con le opzioni reali: solo i backend installati e autenticati, solo gli alias configurati. La chat è l'interfaccia, non la fonte.

{ "architect":     { "mode": "host" },
  "builder":       { "model": "opencode:openrouter/deepseek/deepseek-v4-pro",
                     "max_parallel": 3 },
  "code-reviewer": { "model": "claude:opus", "tier": "xhigh" },
  "ui-reviewer":   null,                       ← non serve, stavolta
  "tester":        { "model": "opencode:openrouter/deepseek/deepseek-v4-flash" },
  "budget_usd":    10 }                         ← null ⇒ nessun tetto

Il cast è un file, non un ricordo della chat: sopravvive alla compattazione del contesto, si committa, si condivide. La mattina dopo /claustrum dice «cast default trovato — lo uso o rifacciamo?».

orlodax@tks:~/claustrum$ claustrum sync --only claude,opencode,cursor,copilot

I ruoli: una fonte, resa in ogni harness

roles/builder/ROLE.md         corpo neutro, con {{token}}
roles/builder/role.json       tier → classe di modello, permessi
roles/builder/parts/delegation.claude.md
roles/builder/parts/delegation.default.md
roles/_shared/house-rules.md   «AGENTS.md e CLAUDE.md sono legge»
roles/_shared/report/builder.mdschema del report
HarnessReso in
Claude Code.claude/agents/*.md + stub -xhigh/-max generati
opencode.opencode/agents/*.md
Cursor.cursor/agents/*.md
Copilot / VS Code.github/agents/*.agent.md

I cinque ruoli che avevamo (architect, builder, code-reviewer, ui-reviewer, tester) diventano un solo testo ciascuno. L'unico contenuto davvero specifico di Claude era il meccanismo di delega — «usa il tool Agent con subagent_type: builder» — e diventa una parte per harness.

I ruoli non nominano modelli: nominano classi — frontier-coding, cheap-coding, fast — che ogni sviluppatore mappa sui propri modelli in claustrum.json. Lo stesso file di ruolo serve chi ha solo Claude e chi ha solo DeepSeek.

Ogni file generato porta un marcatore in prima riga; sync --check segnala in CI chi l'ha modificato a mano, e un file senza marcatore non viene mai sovrascritto. La cartella ~/.claude/agents/ di partenza diventa un output di sync --global.

orlodax@tks:~/claustrum$ claustrum backends list

Cinque backend, un'interfaccia: aggiungerne uno è una classe

BackendCome entra il ruoloPermessi «edit + shell, mai push»Cosa legge
claude--append-system-prompt-file (file, mai JSON inline attraverso lo shim .cmd di npm)--permission-mode acceptEdits --permission-prompts none --disallowedTools "Bash(git push*)"--output-format json: result, session, costo
opencodeagente inline in OPENCODE_CONFIG_CONTENT: non tocca il repo né ~/.configpermission: {"edit":"allow","bash":{"*":"allow","git push*":"deny"}}--format json, eventi JSONL
cursornessun gancio di system prompt: il ruolo va in testa al prompt-f + regola nel prompt (advisory, e doctor lo dice)--output-format json
copilotfile agente per job (COPILOT_HOME dedicato)--allow-all-tools --deny-tool "shell(git push)"--output-format json, JSONL
apisystem message = corpo del ruolo; nessun tooln/a — solo ragionamento (revisore, pianificatore)OpenRouter o Anthropic, per prefisso del modello
interface IBackend {
  Task<Doctor> DetectAsync(…);
  ProcessSpec  Build(ResolvedRun run);
  ParsedOutput Parse(stdout, stderr, exit);
}

Il backend suggerisce quali file ha toccato; git decide. Snapshot prima e dopo lo spawn: changed_files e diff sono corretti anche per un harness il cui JSON non elenca le modifiche.

Claustrum lancia i backend sul sistema in cui gira: il binario Windows parla agli harness Windows, quello WSL a quelli Linux. Mai una traduzione D:\ ↔ /mnt/d. doctor avvisa quando i due si mescolano.

orlodax@tks:~/claustrum$ grep -rn "enforced" NOTES.md

Le regole che contano si impongono, non si chiedono

Il revisore deve vedere solo il task e il diff. Prima era una frase nel prompt dell'architetto, affidata alla sua disciplina.

Ora, per un ruolo blind: true, il runner rifiuta un brief che contenga ## Context, ## Plan, ## Rationale o un blocco claustrum-report incollato — exit 2, «blind role: brief carries rationale».

N builder nello stesso checkout si sovrascrivono a vicenda. Con max_parallel > 1 ogni job ha il proprio git worktree su un ramo claustrum/<job>; l'architetto integra con rebase, mai merge commit.

Il tetto di parallelismo è un semaforo nel job manager, condiviso da CLI e MCP: un architetto spawnato che esagera aspetta.

Contabilizzato sull'intero albero di job: un figlio che sforerebbe il residuo viene rifiutato con BudgetExceeded, non lanciato.

Ed è disattivabile: "budget_usd": null, o «nessun tetto» al questionario. Quando è spento, cast show stampa budget: unlimited — la scelta resta visibile.

La stessa filosofia di «Errori di fabbrica», parte V: un processo che regge non conta sulla vigilanza di chi lo esegue. Qui la membrana non è un prompt, è un if.

orlodax@tks:~/claustrum$ claustrum coordinate --cast default --issues 12,13

Due modi di dirigere: dal podio o spawnato

L'agente con cui stai parlando è l'architetto: adotta il ruolo sincronizzato ed emette lui le deleghe. Funziona in ogni host, usa l'abbonamento dell'host. È il caso normale: tu in chat, lui che chiama delegate.

claustrum coordinate lancia anche l'architetto, in modalità headless, sul backend scelto dal cast — claude -p usa l'abbonamento Claude — con il cast iniettato e Bash(claustrum *) permesso. L'architetto chiama Claustrum ricorsivamente per builder, revisori, tester.

Il pipeline è il prompt dell'architetto. Claustrum fornisce il cast, il gate cieco, il semaforo, il budget sull'albero, e il progresso via job_status. Nessuna macchina a stati.

gh issue view <n> --json title,body diventa il ## Task del brief; il commit finale cita Closes #n. Un'issue che non sta sulla board non esiste — e questa la chiude chi l'ha risolta, nella stessa passata.

La frase-obiettivo, che è anche il test di accettazione: «usa claustrum per coordinare queste issue con un architetto Opus dal mio abbonamento, che spawni tre builder DeepSeek V4 Pro da OpenRouter, poi revisione con Opus, e il tester su Flash». Una riga in chat, il resto senza mani.

orlodax@tks:~/claustrum$ exit

La misura che chiuderebbe la questione

Non un'altra tabella di benchmark che si contraddicono. Il tasso di divergenza per ruolo, letto dal registro che i revisori ciechi già producono: Flash nei posti da builder, Opus in quello dell'architetto, e il livello di falsificazione che risponde al posto nostro.

Claustrum serve esattamente a poter fare quell'esperimento senza che ognuno debba cambiare strumento. Il cast è un file: la settimana prossima ne proviamo uno insieme, ciascuno dal proprio podio.

Testo e strumento di orlodax. Tema: terminale a fosfori, scanline CRT e pioggia di glifi; JetBrains Mono. Il logo è nel font «ANSI Shadow», lo stesso della copertina di Kriss Journey. Cifre di costo dalla nota interna «Claude vs DeepSeek», settembre 2026 — ipotesi da sostituire con misure.

Fine. Home torna alla copertina.