Un LLM senza attuatori è un bot: parla bene ma non agisce. Quando aggiungi tool sandboxati diventa un agente: parla e agisce, ma solo con le azioni che il progettista gli ha pre-cablato. Il passo successivo — e l'obiettivo di questo documento — è renderlo capace di costruirsi nuovi attuatori quando quelli esistenti non bastano, entro i limiti di sicurezza.
La metafora: un LLM con tool fissi è come un cervello collegato a mani che possono fare solo certi gesti. Se il compito richiede di girare una chiave e le mani sanno solo premere pulsanti, l'agente fallisce. Un bravo agente, a quel punto, fabbrica la capacità di girare la chiave — nel nostro caso scrivendo un piccolo applet di codice — ma lo fa sotto vigilanza.
Chiamiamo questi applet neuroni perché hanno tre proprietà che tornano in testa leggendo la letteratura neuroscientifica:
Un neurone è la materializzazione di una capacità che myclaw non aveva, sintetizzata al bisogno, approvata dall'utente, e poi riusabile.
| Componente | Descrizione |
|---|---|
| Corpo | Un modulo Python con una funzione principale che rispetta il Protocol Tool di myclaw (stesso contratto dei tool nativi). |
| Manifest | YAML: nome, versione, scopo in linguaggio naturale, capability richieste (es. "solo fs-read in ~/downloads"), quote (CPU/ram/io max). |
| Test di nascita | Un piccolo script di test che dimostra che il neurone fa ciò che dice. Viene eseguito in sandbox prima dell'attivazione. |
| Firma | HMAC sul contenuto del corpo + manifest, fatta con una chiave interna di myclaw al momento dell'approvazione. Qualunque modifica successiva al file invalida la firma e disattiva il neurone. |
| Metadati di vita | Contatori: quante volte invocato, con quale esito, quali neuroni chiama/è chiamato da, ultimo uso. Permettono potatura automatica dei dormienti. |
Un neurone non nasce spontaneamente. Nasce da un fallimento esplicito: l'agente ha provato tutti i tool conosciuti, nessuno ha prodotto il risultato richiesto, e l'utente non ha dato il permesso di abbandonare il compito.
Un neurone non è un diritto acquisito. L'approvazione iniziale lo fa nascere, ma nella library ci resta solo se produce utilità. L'utilità ha una definizione precisa: riduzione del gap tra la capacità attuale di myclaw e la capacità necessaria a raggiungere lo scopo. Il resto è conseguenza: chi riduce il gap vive, chi non lo riduce muore, l'ambiente — cioè gli scopi che myclaw persegue — seleziona.
n su uno scopo g:u > 0, il neurone ha prodotto utilità. La fitness
di un neurone è la somma pesata delle sue utilità nel tempo, con decadimento
sulle osservazioni vecchie (curva tipo Ebbinghaus: MemoryBank, Zhong
et al. 2023).
Lo scopo che misura la fitness può nascere da fuori (l'utente ha chiesto qualcosa) o da dentro (myclaw nota un gap ricorrente e vuole colmarlo). Sono qualitativamente diverse e richiedono gate diversi.
| Modalità | Come nasce lo scopo | Gate umani |
|---|---|---|
| Esterna reattiva |
L'utente chiede una cosa. Il reasoning loop esaurisce i tool disponibili senza soluzione. Il synthesizer propone un neurone candidato per questo singolo scopo. | Uno: approvazione prima dell'attivazione (gate §3.6). |
| Interna proattiva, presidiata |
myclaw nota un pattern: "negli ultimi N giorni ho fallito M volte su task di tipo Y". Emette una proposta di auto-evoluzione: "vorrei fabbricarmi la capacità Y". | Due: (a) approvazione della direzione prima che la sintesi parta, (b) approvazione dell'attivazione del neurone sintetizzato. |
| Tipo di task | Metrica del gap |
|---|---|
| Concreto "leggi log", "manda messaggio", "cerca file" |
Numero di passaggi tool residui per raggiungere lo stato obiettivo, tempo di wall-clock, exit code atteso. Misurabile con precisione: fitness affidabile. |
| Sfumato "riassumi", "spiegami", "cosa ne pensi" |
Scostamento dalla qualità attesa, valutato da un critic LLM o da feedback esplicito dell'utente. Asimmetria prudenziale: un feedback negativo pesa più di uno positivo. |
| Sconosciuto primo incontro con una classe di task |
Gap non misurabile. Il neurone non accumula fitness e resta in prova. Dopo K invocazioni senza segnale oggettivo, scompare dall'indice di retrieval (non dalla library). |
| Fase | Trigger | Chi decide |
|---|---|---|
| Nascita | Fallimento + scopo (esterno o interno) | Synthesizer propone; utente approva (uno o due gate) |
| Attivazione | Scopo che il retriever associa al neurone | Policy + retriever semantico (+ quota esplorativa) |
| Valutazione | Fine invocazione | Misura Gappre → Gappost; aggiorna fitness |
| Declino | Fitness cumulativa sotto soglia, o silenzio > 90 gg | Perde visibilità nel retriever (non nella library) |
| Quarantena | N strike ravvicinati, firma invalida, capability superate | Policy automatica |
| Estinzione | Manuale o dopo M giorni di quarantena | Archivio, firma revocata, file letto solo per forensica |
Un neurone da solo è un tool in più. Un insieme di neuroni che si chiamano tra loro è una rete. La struttura di quella rete — chi chiama chi, con che frequenza, con quale successo — è l'equivalente di una memoria comportamentale del sistema.
summarizer è il nodo più "caldo" (alto traffico). La sinapsi dichiarata ma mai usata tra tg-send e nas-ping è una candidata alla potatura. yt-dl è stato messo in quarantena perché qualcuno ha toccato il file e la firma non torna.Servono tre orizzonti temporali, con tre scope diversi. La distinzione non è decorativa: ogni livello ha un criterio di iniezione nel prompt, un criterio di persistenza, un criterio di compressione.
Vive in RAM, nel solo processo dell'agente, per la durata della richiesta corrente. Contiene: i pensieri intermedi ("devo prima leggere il log"), gli output parziali dei tool, il piano ancora da eseguire. Quando l'azione termina, viene scartata o — se contiene qualcosa che vale — promossa alla memoria media via distillazione.
Una tabella SQLite in workspace/memory/medium.db. Contiene la storia
della conversazione corrente e dei compiti coesi recenti. Ha retention automatica:
dopo N giorni o M messaggi, compressione (riassunto via LLM) e archiviazione.
Le parti che durante la compressione risultano stabili e generali vengono
proposte per la promozione a lunga.
I file markdown del workspace: SOUL.md (la Costituzione — le quattro leggi),
IDENTITY.md, USER.md, la parte stabile di MEMORY.md.
Questo blocco è sempre in testa al prompt di sistema, con prompt caching
di Anthropic/OpenAI per non pagarlo a ogni chiamata. È anche l'unico livello
che Roberto edita direttamente con un editor di testo.
La memoria lunga ha un nucleo non editabile neanche da Roberto senza un rito
esplicito: la Costituzione. Sono le leggi di Asimov rimaneggiate
per un maggiordomo domestico. Vivono in SOUL.md e sono il primo
contenuto che ogni chiamata LLM vede.
Le leggi sono numerate e ordinate: in conflitto, la legge di numero più basso vince. Sono iniettate come blocco cachabile in ogni prompt, prima del resto della memoria lunga.
| Meccanismo | Cosa fa | Attivazione |
|---|---|---|
| Quota CPU | Ogni neurone ha un budget (default: 5s CPU per chiamata, configurabile al ribasso nel manifest). | Automatica. Superamento → kill del processo + strike. |
| Quota RAM | Default 256 MB. setrlimit prima di exec. | Automatica. Superamento → OOM-kill. |
| Quota I/O | Max N scritture/giorno, max M byte/giorno su filesystem. | Counter nel registry, enforce pre-call. |
| Quota natalità | Max 3 nuovi neuroni/giorno. Max 20 attivi contemporaneamente. | Synthesizer rifiuta se saturo; chiede all'utente se archiviare i dormienti. |
| Strike system | 3 fallimenti nell'arco di 24h → quarantena automatica. | Counter per-neurone, reset giornaliero. |
| Kill-switch | Comando admin che disabilita immediatamente un neurone o tutti. | myclaw neuron disable <name> / myclaw neuron panic |
| Quarantena | Stato intermedio: il neurone esiste nel registry ma non è invocabile. I dati di uso sono preservati per diagnosi. | Automatica (strike, firma invalida, capability non rispettate) o manuale. |
| Revoca firma | Annulla definitivamente un neurone. Il file resta per forensica ma è inerte. | Manuale, atto irreversibile. |
SOUL.md solo attraverso il "rito costituzionale": edit manuale
da filesystem (fuori da myclaw), reboot del gateway, audit log con entry
"constitution modified".
Rispetto all'architettura di partenza (intro §3), i neuroni non creano uno strato nuovo: abitano lo strato 4 (Workspace & Tool) e lo fanno con gli stessi vincoli dei tool nativi.
| Strato | Impatto dei neuroni |
|---|---|
| 1 — Gateway | Nessuna modifica strutturale. Il gateway espone endpoint amministrativi aggiuntivi: /neurons (list/activate/quarantine). |
| 2 — Policy | Estesa: la policy ora valuta anche le capability dichiarate dal manifest. Capability non-coperte dal livello di autonomy corrente → bloccate. Approvazione di un nuovo neurone è un passaggio di policy. |
| 3 — Sandbox | Hosta due pipeline aggiuntive: synth-sandbox (profilo extra-tight per eseguire i test di nascita) e forbidden-call detector (AST scan prima del test). |
| 4 — Workspace/Tool | Registry unificato: tool nativi + neuroni attivi. Un call-site del reasoning loop non distingue "è nativo" vs "è neurone", vede solo Tool. |
workspace/neurons/
└── nas-ping/
├── manifest.yaml # scopo, capability, quote, sinapsi dichiarate
├── neuron.py # il corpo (Protocol Tool)
├── test_neuron.py # il test di nascita
├── signature # HMAC del corpo+manifest, intestata a myclaw root
└── journal.jsonl # counter di uso, ultimi esiti, errori
Esempio minimo di manifest.yaml:
name: nas-ping
version: 1.0
born: 2026-04-21T22:14:00Z
approved_by: roberto
scope: "verifica raggiungibilità del NAS di casa con ping ICMP + arp"
capabilities:
- net.ping: { hosts: ["192.168.1.50"] }
- shell.exec: { allowlist: ["/usr/bin/ping", "/usr/sbin/arp"], timeout_s: 5 }
quotas:
cpu_s: 2
ram_mb: 64
io_writes: 0 # read-only neuron
synapses_declared:
- tg-send # può notificare via Telegram
- log-parser # può leggerne l'output
signature_algo: hmac-sha256
I neuroni entrano in roadmap dopo la fase 4. Prima di saperli generare, myclaw deve saper eseguire tool con sicurezza.
| Fase | Obiettivo | Prerequisito |
|---|---|---|
| 0 ✓ | Architettura d'insieme (v1) + questo (v1.1 neuroni+memoria+darwin) | — |
| 1 | Gateway + CLI + tool shell/fs in sandbox | architettura v1 approvata |
| 2 | Policy + memoria lunga (file markdown nel workspace) | workspace docs |
| 3 | Telegram + pairing + memoria media (SQLite) | pairing + memory docs |
| 4 | Tool dispatch completo + memoria immediata formalizzata | agent_runtime doc |
| 5 | Synthesizer in modalità dry-run: produce bozze ma non le attiva. Utile per calibrare. | synthesizer doc |
| 6 | Synthesizer live + registry neuroni + firma + kill-switch | neuron doc + constitution doc |
| 7 | Sinapsi (grafo + decadimento + promozione automatica a lunga) | synapse doc |
| 8+ | Refinement: UI registry, diagnostic dashboard, export/import di neuroni tra istanze | valutato caso per caso |
neuron.html — struttura, manifest schema, firmasynthesizer.html — pipeline di sintesi, gate, rifiutosynapse.html — grafo, counter, decadimentoconstitution.html — le 4 leggi, il rito di modificamemory.html (già previsto) — ora con 3 livelli esplicitiLi aggiungo subito all'indice microprogettazione.
myclaw — Neuroni, Sinapsi e Memoria v1.1 — 2026-04-21
Estende Architettura — Introduzione v1.