← Indice documentazione Microprogettazione › review di coerenza v1

myclaw

Review di coerenza — giro sui 19 doc di microprogettazione
v1.0 — 22 aprile 2026
Chiude la fase di microprogettazione. Apre la fase 1 di implementazione.

Indice

  1. Scopo e metodo
  2. Mappa dei punti caldi
  3. Incongruenze forti (da risolvere)
  4. Gap e riferimenti orfani
  5. Ridondanze
  6. Tensioni già accettate (non riaprire)
  7. Coerenze da preservare
  8. Piano di rimedio priorizzato

1. Scopo e metodo

Alla chiusura della microprogettazione, i 19 doc esistenti in docs/architecture/ sono stati letti uno a uno e confrontati incrociatamente per stanare incongruenze prima che il codice le pietrifichi. Questo doc è il referto, non una nuova decisione di design.

Il perimetro della review: i 17 doc della lista canonica di Prospettive & Giudizio §8 più i 2 doc di estensione (types.html, rl_offline.html). Totale: 19 HTML.

Il metodo: per ogni doc estrai (i) Protocol/classi, (ii) tipi cross-componente citati, (iii) eccezioni, (iv) decisioni chiave, (v) link uscenti, (vi) callout "DECISIONE DA CONFERMARE". Poi confronta tutti-con-tutti cercando cinque forme di frizione:

CategoriaCriterioSeverità
Incongruenza forteStesso concetto definito in modo conflittuale in due o più doc. Blocca l'implementazione.alta
GapTipo o concetto citato ma non definito in nessun doc, oppure link rotto a doc atteso.media
RidondanzaStesso meccanismo spiegato in più posti senza fonte canonica dichiarata.bassa
Tensione accettataGià esplicitata in uno dei doc come trade-off vissuto. Non riaprire.ok
Coerenza forteCross-reference che funziona: la stessa idea riemerge invariata in più doc.ok
Cosa questo doc non fa. Non riscrive i doc, non decide al posto del progettista e non introduce concetti nuovi. Segnala solo. Le fix sono elencate al §8 con priorità e doc target, ma l'applicazione sarà una serie di edit puntuali sui doc esistenti, non un nuovo doc.

2. Mappa dei punti caldi

Prima dei referti puntuali, una vista d'insieme. I quattro tipi cross-componente più attraversati sono stati tracciati contro i doc che li nominano. Ogni cella è colorata secondo lo stato di coerenza tra i doc coinvolti.

Tipo / concetto Doc che lo definisce o nomina (colore = stato) ExecutionTrace agent_runtime eval memory observability types rl_offline Approval (request + timeout) approval_ux gateway policy constitution channel Session / binding gateway memory channel agent_runtime Budget / cost cap policy agent_runtime config observability Fitness / TrustScore rl_offline synapse neuron policy fonte canonica cita coerentemente conflitto o gap dovrebbe citare, non lo fa
Figura 1 — I cinque tipi cross-componente più attraversati. Le celle rosse guidano il capitolo §3.

3. Incongruenze forti (da risolvere)

Sei casi. Per ciascuno: descrizione, doc coinvolti, rimedio proposto. La severità è alta per tutti: vanno risolti prima di iniziare l'implementazione dei componenti coinvolti.

3.1 — Ciclo di vita di ExecutionTrace frammentato alta

Doc coinvolti: agent_runtime.html · eval.html · memory.html · observability.html · types.html

agent_runtime la dichiara "fonte unica di verità". observability la serializza come JSONL append-only. memory dice che "vive dentro ExecutionTrace del turno" per la working memory, e che a fine turno promuove step a episodi. eval riusa l'oggetto per il replay. Nessuno dei cinque doc definisce chi crea, chi chiude (marca immutabile), chi persiste, e in quale ordine.

Rimedio. Eleggere types.html come fonte canonica dello schema e agent_runtime.html come fonte canonica del ciclo di vita. Aggiungere un diagramma di stato (open → steps_appended → closed → persisted → promoted) a agent_runtime.html. Gli altri doc si limitano a citare.

3.2 — Timeout di approvazione: 15 min vs 30s/2m/5m/15s alta

Doc coinvolti: gateway.html §4.1 · approval_ux.html §8

gateway.html riga 500 fissa timeout_at = now + APPROVAL_TIMEOUT con commento "default 15 min". approval_ux.html §8 definisce invece una tabella per-canale: CLI 30s, Telegram DM 2 min, canale di casa 5 min, voce 15 s. Sono numeri incompatibili.

Rimedio. La tabella di approval_ux è il default corretto (è stata disegnata pensando al canale). Correggere il commento di gateway.html: timeout_at viene calcolato dal Channel, non dal Gateway, tramite un metodo default_approval_timeout() sul Protocol Channel. Il Gateway riceve un timedelta, non hardcoda 15 min.

3.3 — PlannedAction vs ApprovalRequestDraft: due nomi per una cosa sola? alta

Doc coinvolti: types.html §4.1 · constitution.html §9 · gateway.html §4.1 · policy.html

types.html definisce PlannedAction come input di Policy.check(). constitution.html la usa nello stesso senso. Ma gateway.html §4.1 introduce ApprovalRequestDraft come output della Policy, che il Gateway converte in ApprovalRequest. Dai doc non è chiaro se sia lo stesso oggetto rinominato, un super-tipo, o una seconda entità.

Rimedio. Scegliere UNA delle due opzioni e documentarla in types.html: (a) PlannedAction è l'input, ApprovalRequestDraft = PlannedAction + decision_hint dal Policy; (b) sono la stessa classe con un campo opzionale policy_decision. Opzione (a) è più pulita ma richiede un nuovo tipo; opzione (b) è più snella. Default conservativo: (a).

3.4 — Fitness / TrustScore non collega neurone a policy alta

Doc coinvolti: synapse.html · neuron.html §6 · rl_offline.html · policy.html

synapse.html definisce "utility = gap_pre − gap_post" per-sinapsi. neuron.html registra gli esiti nel journal per-neurone. rl_offline.html introduce TrustStore come aggregatore. Ma policy.html non ne cita nessuno: una Policy che non guarda la fitness è una Policy cieca rispetto alla selezione darwiniana.

Rimedio. In policy.html, aggiungere una sotto-sezione "input di fiducia" dove si documenta che Policy.check() riceve lo TrustScore corrente del neurone (se è un neurone) e può usarlo per alzare o abbassare la soglia di approvazione. Formula aggregata documentata in rl_offline.html.

3.5 — Binding sender → session → memory non documentato end-to-end alta

Doc coinvolti: gateway.html · channel.html · memory.html

gateway.html "crea e gestisce sessioni". channel.html non menziona sessioni: un messaggio entra come InboundMessage(sender, channel, body), il mapping a session_id è invisibile. memory.html non dice se episodic è indicizzata per-sender o per-session. Quando un utente apre un nuovo turno, come la memoria episodic viene richiamata?

Rimedio. In gateway.html, aggiungere una sotto-sezione "chiave di binding": session_id = hash(sender, channel, window) dove window è chiuso per idle timeout (§8 del gateway). In memory.html, specificare che episodic è indicizzata per sender (non per session), semantic è globale, working muore con la session.

3.6 — Audit log: doppia ownership tra gateway e observability alta

Doc coinvolti: observability.html · gateway.html · neuron.html §6 · synapse.html

observability.html dichiara il journal append-only JSONL come componente centrale. Ma gateway.html descrive la persistenza di ExecutionTrace a fine turno; neuron.html §6 tiene un co_activations.sqlite per-neurone; synapse.html ha un grafo con contatori. Quattro journal, nessuno dichiarato "ombrello".

Rimedio. In observability.html, aggiungere un capitolo "sorgenti di verità" con questa gerarchia: (1) audit.jsonl append-only è la sorgente ombrello di eventi; (2) traces/*.json è il rollup immutabile per-turno; (3) il journal per-neurone e il grafo sinaptico sono derivati che possono essere ricostruiti da (1) + (2) in caso di perdita. Chi scrive cosa → tabella.

4. Gap e riferimenti orfani

Tipi o concetti citati nei doc ma non definiti in nessun posto. Severità media: si possono tollerare per qualche settimana, ma ogni implementazione che li incontra deve stoppare e chiedere.

4.1 — FactProposal / MemoryFact non ha schema

Origine: memory.html §6 · Atteso in: types.html

memory.html descrive la reflection che produce "proposte di fatto" soggette ad approvazione umana. Il tipo Python di queste proposte non esiste. È str? un dict? un oggetto con confidence?

Rimedio. Definire in types.html: FactProposal(text, category, confidence, source_trace_ids, proposed_at). MemoryFact = FactProposal + approved_at + approver.

4.2 — Tasso di decadimento memoria: valori mancanti

Origine: memory.html §7 · synapse.html

memory.html cita "decay · days_since_last_access" senza il valore. synapse.html ha Ebbinghaus/ACT-R come ispirazione ma non fissa la costante. Sono due decadimenti indipendenti o derivano dalla stessa base?

Rimedio. In synapse.html fissare una tabella di costanti (Ebbinghaus k=0.05/die per episodic, forse molto più lento per semantic). memory.html cita la tabella di synapse.html come fonte.

4.3 — Retry su policy_denied non specificato

Origine: agent_runtime.html §4 · policy.html

agent_runtime documenta "2 retry massimi su validation error". policy.html non cita retry: che succede quando un'azione viene negata due volte di fila? Autoban del neurone? Escalation a utente?

Rimedio. In policy.html: dopo 2 policy_denied consecutivi sullo stesso tool, escalation a "richiesta chiarimento" verso l'utente. Non autoban (il neurone può avere un uso legittimo in altro contesto).

4.4 — Compressione context > 20 turni: quando esattamente

Origine: agent_runtime.html §3 · memory.html

La sintesi via LLM "oltre 20 turni" è citata ma non è chiaro se avviene (a) all'ingresso del 21° turno prima del prompt, (b) a fine del 20° turno come preprocessing asincrono, (c) on-demand quando il context overflow si profila.

Rimedio. (a) è la più semplice e determinista. Fissarla in agent_runtime.html §3 esplicitamente.

4.5 — Resurrezione di neurone estinto

Origine: neuron.html §7

Estinto → .audit/neurons_extinct/. Il file è recuperabile manualmente? Se sì, come; se no, è delete logico e basta dirlo.

Rimedio. In neuron.html: estinzione è delete logico con retention 90 giorni. Resurrezione richiede comando esplicito dell'utente (neuron resurrect <id>) e rigenera una nuova firma (il vecchio journal è preservato come read-only).

4.6 — Override di budget vs Leggi

Origine: agent_runtime.html §6 · config.html §4 · constitution.html

I cap 2€ soft / 5€ hard sono in agent_runtime. config.html li rende configurabili. constitution.html non dice se un override di config possa violare una Legge (es. Legge di omeostasi). Fatto di policy non banale.

Rimedio. In constitution.html: i budget sono parametri, non Leggi. Il cap hard è però limitato dall'alto da un "cap costituzionale" (es. 20€/die) hardcoded che la config NON può superare. Documentarlo come nota nell'articolo che introduce la Legge 0.

4.7 — Journal per-neurone vs grafo sinaptico: chi è derivato

Origine: neuron.html §6 · synapse.html

Entrambi registrano co-attivazioni. Uno è la sorgente, l'altro è un rollup? Oppure sono due sorgenti indipendenti che possono divergere?

Rimedio. Vedi §3.6: il journal per-neurone è la sorgente di dettaglio; il grafo è un rollup periodico (ogni N eventi) ricostruibile. synapse.html dichiara la sua natura derivata.

5. Ridondanze

Tre meccanismi sono descritti in più posti senza una fonte canonica nominata. Severità bassa: il lettore può assemblare, ma è fragile.

5.1 — Il flusso di approvazione è spiegato in tre posti

agent_runtime.html §4 (gate nel loop) · approval_ux.html §3 (macchina a stati) · gateway.html §4.1 (build_approval_request)
Rimedio. approval_ux.html è la fonte canonica della macchina a stati e dei tempi. Gli altri due doc citano + linkano. Rimuovere duplicazioni descrittive lasciando solo "come il loop/gateway si aggancia alla macchina a stati".

5.2 — Structlog citato parzialmente da tre doc

observability.html §4 · gateway.html §8 · config.html
Rimedio. observability.html è canonico. config.html definisce solo le env var (LOG_LEVEL, LOG_FORMAT). gateway.html rimuove la menzione in §8 e linka observability.

5.3 — Prompt caching: 7 blocchi vs 3 blocchi

agent_runtime.html §3 (7 blocchi) · memory.html §8 (si concentra su ②④⑤)
Rimedio. agent_runtime.html canonica. memory.html cita per numero senza ripetere la tabella.

6. Tensioni già accettate (non riaprire)

Quattro frizioni sono scelte consapevoli documentate. Le elenco per evitare che un futuro passaggio di refactoring le tratti come bug.

TensioneDove è motivataStato
Supervised mode rischia automation biasapproval_ux.html §1 · §7 (tutor mode)accettata
Antropomorfizzazione del vocabolario ("neurone", "sinapsi")constitution.html §6 · approval_ux.html §1accettata
Reflection non produce apprendimento autonomo (serve approvazione)memory.html §6accettata
Gateway è un processo unico, non microservizigateway.html §2accettata

7. Coerenze da preservare

Tre cross-reference funzionano e vanno protette: se in fase di implementazione si è tentati di erodere uno di questi pattern per comodità, fermarsi.

7.1 — ExecutionTrace come backbone semantico

Nonostante il §3.1, il concetto (una singola struttura immutabile post-chiusura, append-only durante l'esecuzione, consumata da audit/replay/eval/memory) è la spina dorsale del progetto ed è la cosa più preziosa. I doc sono allineati sul cosa è; il rimedio §3.1 tocca solo il ciclo di vita.

7.2 — Legge 0 sovrana rispetto a tutto il resto

constitution.html §3 dichiara la Legge 0 ("perimetro fisico e legale"). policy.html, sandbox.html, approval_ux.html ne discendono senza mai provare a negoziarla. Coerenza perfetta.

7.3 — Marker <untrusted> come boundary unica

agent_runtime.html §3 e constitution.html §7 adottano lo stesso tag per wrappare contenuti esterni non fidati. Nessun doc propone un pattern alternativo. Da riusare identico in tool.html (web_fetch) e channel.html (inbound).

8. Piano di rimedio priorizzato

Una tabella, con priorità, doc da editare, stima di effort. Da eseguire prima di iniziare la fase 1 di implementazione.

#FixSeveritàDoc da toccareEffort
1Diagramma di stato ExecutionTrace (§3.1)altaagent_runtime.html + nota in types.htmlM
2Sposta approval_timeout su Channel, rimuovi hardcode 15 min (§3.2)altagateway.html, channel.htmlS
3Unifica PlannedAction / ApprovalRequestDraft (§3.3)altatypes.html, gateway.html, policy.htmlM
4Policy.check() legge TrustScore (§3.4)altapolicy.html, rl_offline.htmlS
5Binding sender → session → memory end-to-end (§3.5)altagateway.html, memory.html, channel.htmlM
6Gerarchia sorgenti-di-verità del journal (§3.6)altaobservability.html, neuron.html, synapse.htmlM
7Schema FactProposal / MemoryFact (§4.1)mediatypes.html, memory.htmlS
8Costanti di decadimento (§4.2)mediasynapse.html, memory.htmlS
9Retry su policy_denied (§4.3)mediapolicy.htmlS
10Timing della compressione context (§4.4)mediaagent_runtime.htmlXS
11Retention/resurrezione neurone estinto (§4.5)medianeuron.htmlS
12Cap costituzionale sul budget (§4.6)mediaconstitution.htmlXS
13Chiarire journal derivato (§4.7)mediasynapse.htmlXS
14Canonizzare fonti (§5.1-5.3)bassavariM

Effort: XS = 1 paragrafo, S = 1 sezione breve, M = sezione con figura o tabella.
Totale effort: ~3 M + 6 S + 3 XS + 2 M (ridondanze) ≈ 1 giornata di lavoro di editing.

Quando fermarsi. I 6 fix di severità alta sono bloccanti: senza di essi, iniziare il codice produrrà un design leak in un modulo specifico. I 7 media sono correggibili durante l'implementazione del doc relativo. I 3 bassa sono refactor di scrittura, si fanno in ultimo.

Continua a leggere

microprogettazione
Indice componenti
I 19 doc oggetto di questa review.
fondamenti · 15 min
Prospettive & Giudizio v1
Il giudizio che ha ordinato la microprogettazione. Questo review ne chiude il ciclo.
microprogettazione
types.html
L'indice dei tipi cross-componente. Molti dei fix §4 atterreranno qui.
home
← Indice principale
Tutti i documenti in un colpo solo.

myclaw — Review di coerenza v1.0 — 2026-04-22
Scritto dopo la chiusura della microprogettazione. Non aggiunge design: segnala.