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
| Persona | Harness | Modelli |
|---|---|---|
| Dario | Claude Code, desktop app, opencode | Fable / Opus / Sonnet + OpenRouter |
| collega A | Cursor | quel che Cursor offre |
| collega B | opencode soltanto | DeepSeek via OpenRouter |
| collega C | Copilot CLI, VS Code | Copilot |
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
// 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
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:
| Compito | le parole di chi lo chiede, tali e quali |
| Perimetro | quali cartelle e file può toccare |
| Non rompere | cosa deve continuare a funzionare |
| Le modifiche | come 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
| Harness | Reso 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
| Backend | Come entra il ruolo | Permessi «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 |
| opencode | agente inline in OPENCODE_CONFIG_CONTENT: non tocca il repo né ~/.config | permission: {"edit":"allow","bash":{"*":"allow","git push*":"deny"}} | --format json, eventi JSONL |
| cursor | nessun gancio di system prompt: il ruolo va in testa al prompt | -f + regola nel prompt (advisory, e doctor lo dice) | --output-format json |
| copilot | file agente per job (COPILOT_HOME dedicato) | --allow-all-tools --deny-tool "shell(git push)" | --output-format json, JSONL |
| api | system message = corpo del ruolo; nessun tool | n/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.
github.com/orlodax/Claustrum
licenza MIT
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.