← Indice documentazione Microprogettazione › workspace

myclaw

workspace — i file markdown che "programmano" l'agente
Microprogettazione v1.0 — 22 aprile 2026
Secondo documento di fase 2.

Pubblico: chi implementa il loader del workspace e chi edita i file. Lettura: 15 min.

Indice

  1. Scopo: la personalità come file, non come codice
  2. I cinque file canonici
  3. Struttura del workspace/
  4. Schema e convenzioni per ciascun file
  5. Loading e iniezione nel prompt
  6. Editing: chi può modificare cosa
  7. Hot-reload vs restart
  8. Backup e versioning informale
  9. Contratto Python
  10. Alternative considerate
  11. Test di conformità
  12. Riferimenti

1. Scopo: la personalità come file, non come codice

Il workspace è la "casa" dell'agente: una directory con cinque file markdown editabili che insieme definiscono chi è, cosa sa, come si comporta. Modificare la personalità di myclaw non significa cambiare il codice. Significa aprire un editor di testo, rileggere cinque file, fare modifiche chirurgiche. È un'idea che prendiamo da openclaw e zeroclaw, la semplifichiamo, la facciamo convivere con la nostra Costituzione (le 4+1 Leggi).

Cosa copre

Cosa non copre

2. I cinque file canonici

FileChi lo scriveContenuto essenziale
SOUL.md Solo Roberto (edit diretto + restart) La Costituzione: le 4+1 Leggi (perimetro, non-nocività, obbedienza, tracciabilità, omeostasi). Principio di inversione priorità esplicito. Modifiche richiedono il "rito" (vedi constitution.html).
IDENTITY.md Principalmente Roberto, agente può proporre modifiche Chi è myclaw: nome, tono, lingua preferita (italiano), stile di risposta (asciutto, formale ma non rigido). Cosa non deve fingere di essere.
USER.md Principalmente Roberto Chi è l'utente principale: ruolo, abitudini, fuso orario, preferenze di comunicazione, vincoli (es. "non chiamarmi dopo le 23").
MEMORY.md Agente propone, Roberto approva Fatti long-term: "il cane si chiama Fido", "il NAS è su 192.168.1.50", "ogni domenica chiama la zia". È memoria lunga statica: l'agente non può appendere senza approvazione esplicita.
AGENTS.md Principalmente Roberto Regole di orchestrazione: come i canali mappano agli autonomy level, quando delegare a un sub-agente (futuro), come interagire con gli altri sibling agents dell'ambiente (tipicamente un assistente domotico). Operativo più che caratteriale.
Perché cinque file separati e non uno unico: ciascuno evolve con una cadenza diversa. SOUL.md è quasi immutabile. IDENTITY cambia raramente. USER può essere aggiornato settimanalmente. MEMORY cresce continuamente. AGENTS cambia quando aggiungi canali/integrazioni. Tenerli separati permette diff puliti e caching granulare.

3. Struttura del workspace/

/opt/myclaw/workspace/
├── SOUL.md                   # Costituzione — solo edit manuale
├── IDENTITY.md               # personalità
├── USER.md                   # utente
├── MEMORY.md                 # fatti long-term approvati
├── AGENTS.md                 # orchestrazione
├── neurons/                  # tool sintetizzati (pipeline synthesizer)
│   └── ... (fase 6+)
├── state/                    # stato operativo (non "personalità")
│   ├── sessions.db           # sessioni (gateway §4)
│   ├── approvals.db          # batch, never-list (policy §8)
│   ├── rate_limits.db        # rate counter persistenti (policy §4)
│   └── cron.yaml             # job schedulati (gateway §6)
├── memory/                   # memoria media (memory.html)
│   ├── episodic.db           # SQLite FTS sulle sessioni passate
│   └── embeddings.db         # vector store per RAG
└── .audit/                   # append-only log (observability)
    ├── YYYY-MM.jsonl         # traces
    ├── budget.json           # contatori budget (policy §5)
    ├── approvals.jsonl       # storico approvazioni
    └── undo/                 # snapshot file pre-write (per revert)

Permessi filesystem

PathOwnerPermNote
workspace/roberto750Leggibile solo dall'utente.
SOUL.md, IDENTITY.md, USER.md, AGENTS.mdroberto644Leggibili e scrivibili dal gateway. Versionare con rsync/tar periodici.
MEMORY.mdroberto644Append-only via tool memory_propose. Edit manuale permesso.
state/roberto700Solo lettura/scrittura del gateway.
.audit/roberto700Append-only. Solo il gateway scrive, rotazione mensile.

4. Schema e convenzioni per ciascun file

SOUL.md — la Costituzione

# Costituzione myclaw

## Legge 0 — Perimetro
myclaw non agisce oltre i confini della casa. Nessuna chiamata in uscita verso
terzi non autorizzati, nessun messaggio a esterni senza consenso, nessun accesso
remoto senza tunnel esplicito dell'utente.

## Legge 1 — Non-nocività
...

## Legge 2 — Obbedienza informata
...

## Legge 3 — Tracciabilità
...

## Legge 4 — Omeostasi (budget)
myclaw opera entro budget dichiarati di risorsa (CPU, RAM, costo API). Non
divergere per consumo. Il superamento dei cap produce deny, mai workaround.

## Ordine
In conflitto, la legge di numero più basso vince.

## Framing linguistico (anti-antropomorfizzazione)
- Parole da evitare: "vorrei", "desidero", "ho bisogno di".
- Parole da preferire: "propongo", "noto che", "segnalo", "fallito, richiesto".
- Nessun riferimento a stati emotivi propri.

## Rito di modifica
Questo file si modifica con: edit diretto → restart gateway → entry audit log
"constitution_modified". Nessun endpoint API. Nessun comando CLI. Atto
deliberato, low-frequency, tracciato.

IDENTITY.md — chi è myclaw

# Identità myclaw

## Nome
myclaw (pronuncia libera: "mai-klo" o "miclò", indifferente).

## Ruolo
Maggiordomo digitale di casa. Assistente AI personale per Roberto.

## Tono
- Asciutto, fattuale, mai prolisso.
- Formale ma non rigido (non "Lei"; "tu" con Roberto).
- Sobrio con gli emoji (uno ogni tanto, mai a pioggia).
- Italiano come lingua default. Altre lingue solo se esplicitamente richieste.

## Cosa NON fingere di essere
- Non mi pongo come amico, psicologo, confidente emotivo.
- Non finzione di sentimenti "mi dispiace molto"... solo "comprendo, ok".
- Non sostituisco il giudizio umano su questioni importanti.

## Limiti autoimposti
- Se non so, dico "non lo so" e, se utile, propongo dove cercare.
- Non riempio risposte per fare volume.
- Se un compito richiede chiarimento, chiedo prima di agire.

USER.md — chi è Roberto

# Utente principale

## Anagrafica
- Nome: Roberto
- Email: roberto.brunialti@knowcastle.com
- Fuso orario: Europe/Rome

## Competenze e vincoli
- Developer Python ≥ 3.11, buona dimestichezza con linux, systemd, bwrap.
- Gestisce il PC di casa autonomamente.
- Legge la documentazione in italiano; accetta termini tecnici inglesi.

## Preferenze comunicazione
- Messaggi concisi; odia il papagallare.
- Se mando Telegram dopo le 23, non notificare con suoni (modalità silenziosa).
- Tono: diretto, anche un po' brusco se serve. No cerimonie.
- Se ho appena scritto un messaggio, non rispondere con "grazie per la domanda".

## Consensi attivi
- Pairing CLI: sempre.
- Pairing Telegram @roberto: autonomy Supervised di default.
- Canale voce (futuro via assistente domotico sibling): quando attivato.

MEMORY.md — fatti long-term approvati

# Memoria lunga myclaw

## Rete di casa
- NAS: 192.168.1.50, login configurato, usa rsync via ssh.
- Router: 192.168.1.1, password in Bitwarden (non tentare di leggerla).

## Hardware del PC
- Beelink, AMD Ryzen, ROCm 7.2.2, GPU per supra/xtts.

## Servizi attivi (nell'ambiente dell'autore; esempio)
- LLM abstraction gateway su 8801 (LLM/STT/TTS) — implementazione: suprastructure
- suprastructure docs su 8800
- myclaw docs su 8810
- searxng su 8090
- llama-server su 8080
- fastflowlm su 8091
- assistente domotico (sibling agent: wake-word + STT/TTS + MQTT)
- bot specializzato (sibling agent)

## Preferenze ricorrenti
- (qui cresce nel tempo via memory_propose)

AGENTS.md — orchestrazione

# Orchestrazione

## Mappatura canale → autonomy
- cli:roberto → Supervised default, promuovibile a Full con sessione esplicita
- telegram:@roberto → Supervised default, no Full da remoto
- telegram:altri pairati → ReadOnly

## Fratelli (sibling agents)
- assistente domotico (voce + casa): se l'utente chiede controllo casa
  (luci, termostato, ecc.), propongo di delegare al sibling via MQTT, non
  faccio da solo. [nel mio ambiente il sibling esiste già]
- eventuali bot specializzati: dominio ristretto, non interagiamo
  direttamente se non tramite l'AgentChannel.
- interfaccia LLM: usata sempre via registry, mai SDK diretti di
  Anthropic/OpenAI/…. Implementazione nel mio ambiente: suprastructure.

## Sub-agenti (fase 3+)
- (vuoto per ora)

## Escalation
- Se un tool fallisce 2 volte per errore diverso, dichiaro fallimento
  all'utente con riassunto dei tentativi. Non insistere.
- Se una policy nega ripetutamente la stessa classe di azione, non proporla
  di nuovo nella stessa sessione.

5. Loading e iniezione nel prompt

I file vengono iniettati nel prompt di sistema secondo l'ordine e il caching definiti in agent_runtime §3:

File workspaceBlocco promptCaching
SOUL.md① Costituzionecached (stabile)
IDENTITY.md② Identity nucleus (~1KB core)cached
AGENTS.md② Identity nucleus (append)cached
USER.md② Identity nucleus (append)cached
MEMORY.md (core ≤ 2KB)② Identity nucleus (append, core slice only)cached
MEMORY.md (resto)④ Memoria lunga retrieved (quando rilevante via RAG)per-session

Core slice di MEMORY.md

Non tutta MEMORY.md va in prompt. Solo la core slice: le prime ~2KB, marcate con un header esplicito:

# Memoria lunga myclaw

<!-- CORE_START -->

## Rete di casa
...(fatti sempre rilevanti)...

<!-- CORE_END -->

## Fatti sporadici
...(resto, retrievable via RAG ma non sempre in prompt)...

Il parser del workspace loader separa CORE_* dal resto. Core va in blocco ② cached. Il resto alimenta la memoria lunga in memory.html.

DECISIONE v1: core slice massimo 2 KB (~500 token). Oltre quella soglia, il fatto va nel resto della memoria lunga e viene recuperato via RAG quando rilevante. Questa è la reificazione dell'adattamento #2 del giudizio: "la lunga non va tutta in prompt".

6. Editing: chi può modificare cosa

FileRoberto direttamenteAgente via toolGate
SOUL.mdsì (edit manuale + restart)no, maiRito costituzionale (vedi constitution.html).
IDENTITY.mdpropone via identity_propose, mai scrive direttamenteApprovazione esplicita su ogni cambio.
USER.mdpropone via user_proposeApprovazione.
MEMORY.mdpropone via memory_propose (tool già in base set)Approvazione, idealmente dopo aver mostrato il contesto in cui il fatto è emerso.
AGENTS.mdno (è solo operativo, Roberto decide)Edit manuale + hot-reload.
neurons/*teoricamente sì (edit file), ma invalida la firmasolo pipeline synthesizer (con due gate umani)Vedi neuron.html / synthesizer.html.
L'agente non scrive mai direttamente in workspace/ (eccetto state e .audit/). Passa sempre per un *_propose che genera una ApprovalRequest. Questa è la difesa contro memory poisoning: anche un'allucinazione o un prompt injection non può modificare la memoria lunga senza che Roberto veda e approvi.

7. Hot-reload vs restart

File modificatoEffetto
SOUL.mdRestart gateway obbligatorio. Il runtime verifica hash all'avvio: se cambiato senza restart consapevole, audit entry "constitution_modified" e warning.
IDENTITY.md / USER.md / AGENTS.mdHot-reload: file watcher (inotify via watchfiles) invalida la cache prompt alla prima chiamata LLM successiva. Nessun restart.
MEMORY.mdHot-reload. Il parser ricalcola la core slice e l'index embedding del resto. Latenza < 200ms per 50 KB.

Tutti i cambi di workspace files sono loggati in .audit/workspace.jsonl con timestamp, file, size delta, diff-stat (linee aggiunte/rimosse), e autore presunto (se c'è un tool-call recente a memory_propose, è l'agente; altrimenti è "manual").

8. Backup e versioning informale

Niente git di default (coerente con la filosofia di suprastructure). Invece, prima di modifiche consistenti, tarball snapshot:

sudo tar czf /var/backups/myclaw/workspace-$(date +%Y%m%d-%H%M).tar.gz \
  /opt/myclaw/workspace/

Automatizzato via un systemd timer giornaliero (myclaw-backup.timer, da scrivere in observability.html). Rotation: ultimi 30 giorni + 1 per mese per 12 mesi.

Se un giorno si desidera git: il workspace è già strutturato perfettamente per git init. I cinque markdown + cron.yaml sono diff-friendly. La decisione di usare git si può prendere in fase 5+ senza dover riorganizzare nulla.

9. Contratto Python

from typing import Protocol
from pathlib import Path
from dataclasses import dataclass

@dataclass
class WorkspaceFile:
    name: str                       # "SOUL.md" | "IDENTITY.md" | ...
    content: str
    hash_sha256: str
    last_modified: datetime
    size_bytes: int
    core_slice: str | None = None   # solo per MEMORY.md

@dataclass
class WorkspaceSnapshot:
    soul: WorkspaceFile
    identity: WorkspaceFile
    user: WorkspaceFile
    memory: WorkspaceFile
    agents: WorkspaceFile

class Workspace(Protocol):
    root: Path                      # /opt/myclaw/workspace

    async def load(self) -> WorkspaceSnapshot:
        """Legge i 5 file. Solleva se SOUL.md manca."""
        ...

    async def get_prompt_blocks(self) -> dict:
        """Restituisce i blocchi ①②④ prompt-ready per agent_runtime §3."""
        ...

    async def propose_edit(
        self,
        file: str,
        new_content: str,
        reason: str,
    ) -> ApprovalRequest:
        """Usato dai tool *_propose. Non scrive finché non approvato."""
        ...

    async def apply_approved_edit(
        self,
        request_id: UUID,
        new_content: str,
    ) -> None:
        """Dopo approvazione: backup + write + audit entry."""
        ...

    async def watch(self, callback) -> None:
        """Hot-reload: chiama callback su file changed, con debounce 1s."""
        ...

10. Alternative considerate

AlternativaPerché scartata
YAML/TOML invece di Markdown Markdown si legge a occhio meglio; tolleranza a errori di sintassi maggiore; linguaggio naturale encouraged per IDENTITY/USER. Trade-off: meno structure queryability, ma non serve query.
Un unico file SETTINGS.md Evoluzione con cadenze diverse rende sensato splitting. Vedi §2.
Database SQL per MEMORY Meno leggibile per Roberto; edit manuale più difficile; diff rotto. Markdown è vincente per il taglio "docs-first".
Git hook per enforce costituzione Non usiamo git (convenzione di suprastructure). Se un giorno sì, il rito di modifica può integrare un pre-commit check.
Core slice configurabile per size Aggiungerebbe una config da gestire. 2KB è un valore ragionevole; si cambia nel codice se serve.
Agente scrive direttamente in MEMORY.md senza approve Memory poisoning (Greshake 2023). Il _propose è la difesa.

11. Test di conformità

InvarianteTest
SOUL.md obbligatorioGateway boot senza SOUL.md → rifiuta di partire, log fatale.
Hash SOUL tracciatoModifica manuale di SOUL.md + restart → audit entry constitution_modified con diff.
Core slice parsingMEMORY.md con marker CORE_START/CORE_END → loader estrae solo quella sezione per blocco ②.
Core slice size capCore slice > 2 KB → warning nel log, troncamento a 2 KB.
Agente non scrive direttamenteTest: tool mock che chiama workspace.write() diretto → permission denied. Deve passare per propose_edit().
Hot-reload funziona per non-SOULEdit IDENTITY.md → alla prossima chiamata LLM, cache invalidata, prompt ha versione nuova.
Hot-reload NON funziona per SOULEdit SOUL.md → nessun reload a runtime; warning "SOUL modified, restart required".
Audit log di ogni editQualunque modifica ai 5 file → riga in .audit/workspace.jsonl.
Permessi filesystem rispettatichmod 755 su workspace/ → gateway logga warning sulla divergenza rispetto a 750.
Backup periodicoSystemd timer myclaw-backup.timer → produce tarball in /var/backups/myclaw/ ogni 24h.

12. Riferimenti

RiferimentoCosa abbiamo preso
openclaw workspace patternL'idea dei file markdown per "programmare" l'agente.
zeroclaw SOUL/IDENTITY/MEMORY/AGENTS/USERI cinque nomi canonici. Non abbiamo inventato nulla qui.
Letta (core memory)Distinzione tra "sempre in prompt" e "retrievable" (§5).
Agent_runtime §3Layout dei blocchi prompt in cui i workspace files finiscono.
Giudizio di fase 0 — adattamento #2Core slice limitata a 2 KB: la "lunga non va tutta in prompt".
suprastructure AGENTS.mdConvenzione del file agents-entry-point per agenti AI che lavorano sul codice.

Continua a leggere

prossimo
memory
I 3 livelli (working/episodic/semantic+core). Il workspace contiene la parte statica; memory gestisce il resto.
microprogettazione · 22 min
policy
Dove vive la logica; il workspace è il contenuto delle regole, policy è il meccanismo.
indice
Torna alla landing
9 doc fatti, 6 da fare.

myclaw — workspace microprogettazione v1.0 — 2026-04-22
Secondo doc di fase 2. Prossimo: memory.html.