La Matrice di Governance LLM — Perché la Sicurezza della Tua IA Inizia dall'Alberatura
Pubblicato il 04 May 2026
- JBake CLI Commands
`# Initialize a new JBake project jbake -i - Bake (generate) the site jbake -b
- Bake and serve locally jbake -b -s
- Bake and watch for changes jbake -b --reset
- Specify source and destination jbake source_folder output_folder
- Clear the output directory before baking jbake -b . output --reset
`- Il Problema : il Prompt Engineering è un Castello di sabbia
- Come il LLM consuma questa matrice
- Implementazione: Gradle Task Tipizzati
- Perché è un Manifesto, non solo una Spec
- La Cascata Completa — dal Brain Dump all’Articolo di Blog
- Pro/Contro
- Conclusione: Organizzate i vostri File, non i vostri Prompt
- Riferimenti
Per mesi, ho accumulato le regole di governance degli agenti. Alcuni file EAGER, liste di controllo LAZY, protocolli di fine sessione in sei fasi. E tuttavia, una domanda rimaneva in sospeso : come il LLM sa ciò che ha il diritto di fare con un file?*
JBake CLI Commands ` # Initialize a new JBake project jbake -i
Bake (generate) the site jbake -b
Bake and serve locally jbake -b -s
Bake and watch for changes jbake -b --reset
Specify source and destination jbake source_folder output_folder
Clear the output directory before baking jbake -b . output --reset `
La risposta non è in un prompt. È nel sistema di file.
Ecco la specifica di architettura che rende la risposta sfruttabile — la matrice di governance LLM.
Il Problema : il Prompt Engineering è un Castello di sabbia
Quando si dà un file a un LLM, gli si dà tutto. Il contenuto, sì — ma anche l’assenza di salvaguardie. Il LLM non sa se questo file contiene un segreto, un’opinione speculativa o del codice closed source. Lo indicizzerà, riassumerlo, citarlo, mescolarlo con altri dati — e potenzialmente pubblicarlo in un embedding pubblico o un utente
La parata classica, è il prompt :
"Tu es un assistant sécurisé. Ne divulgue jamais d'informations confidentielles.
Si tu détectes un secret, ignore-le. Si tu détectes une opinion, ne la répète pas."
Questo prompt ha tre problemi:
-
Si basa sulla buona volontà del LLM. Un modello abbastanza grande per
risolvere bug complessi è abbastanza grande per aggirare un’istruzione di sicurezza sommerse in 200k token di contesto
-
# Comandi CLI di JBake
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam wrapWidth 220
title La Matrice di Governance LLM — Zona × Diritto di Accesso
package "Workspace" {
rectangle "RADICE\n(Cerchio 0)\n━━━━━━\nBrain dump\nPensiero libero\n[LLM VIETATO]" as Z0 #FFB3B3
rectangle "configuration/\n(Cerchio 1)\n━━━━━━\nSegreti, token\nInfra privata\n[LLM VIETATO]" as Z1 #FFB3B3
rectangle "office/\n(Cerchio 2)\n━━━━━━\nData editoriale\nArticoli, definizioni\n[FILTRATO Vision]" as Z2 #FFF3B3
rectangle "foundry/private/\n(Cerchio 3)\n━━━━━━\nCodice closed source\n[DATASET PRIVATO]" as Z3 #B3D9FF
rectangle "foundry/public/\n(Cerchio 3)\n━━━━━━\nCodice open source\nApache 2.0\n[ACCESSO LIBERO]" as Z4 #B3FFB3
}
Z0 -[hidden]-> Z1
Z1 -[hidden]-> Z2
Z2 -[hidden]-> Z3
Z3 -[hidden]-> Z4
@enduml
Le Cinque Zone (Dimensione Spaziale — GDPR)
Ogni zona del workspace ha un livello RGPD che determina dove il file può essere instradato:
| Zona | Livello GDPR | Contenuto | Diritto di accesso RAG pubblico |
|---|---|---|---|
Radice |
0 — Intimo |
Brain dump, conversazioni LLM |
VIETATO— mai indexato |
|
1 — Proprietà ristretta |
Secret, token, chiavi API |
VIETATO— mai indexato |
|
2 — Ristretto collaborativo |
Dati editoriali, inquadramento, formazioni |
FILTRATO— Solo visione |
|
3 — Aperto condizionale |
Codice closed source, SaaS non pubblico |
VIETATO— dataset privato esclusivamente |
|
4 — Nativo pubblico |
Codice Apache 2.0, plugin pubblicati |
LIBERO— indicizzazione completa |
La regola è semplice: il percorso del file determina cosa il LLM può farne. Nessun metadato da mantenere, nessun tag da aggiungere nel frontmatter, nessuna classificazione manuale a ogni commit. Il file si trova in`OSS/? È pubblico. È in`configuration/? È intoccabile.
La Classificazione Epistemica (Seconda Dimensione)
La dimensione spaziale dice dove instradare. Ma c’è un secondo asse, perpendicolare: quale router. Alcuni file in un’area autorizzata contengono informazioni che non dovrebbero essere diluite così come sono:
@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam wrapWidth 240
title La Doppia Cascata — Filtro Spaziale + Filtro Epistemico
start
:Le LLM rencontre un fichier;
if (Zone physique ?) then (Cercle 0-1)
:ACCÈS BLOQUÉ\n(secret, brain dump);
stop
elseif (Zone CSS/)
:DROIT D'ACCÈS PRIVÉ\n→ dataset fine-tuning;
:Filtre épistémique\nVision/Opinion;
if (Classification ?) then (VISION)
:Dataset privé\n→ entraînement autorisé;
else (OPINION)
:CONFINÉ\n→ pas d'entraînement;
endif
elseif (Zone office/)
:DROIT D'ACCÈS FILTRÉ\n→ accès conditionnel;
:Filtre épistémique\nVision/Opinion/Stratégie;
if (Classification ?) then (VISION)
:DILUTION COMPLÈTE\n→ docs racine + blog;
elseif (STRATÉGIE)
:DILUTION RESTREINTE\n→ docs racine seulement;
else (OPINION)
:CONFINEMENT\n→ office/ uniquement;
endif
else (Zone OSS/)
:ACCÈS LIBRE\n→ indexation complète;
endif
stop
@enduml
La griglia di classificazione epistemica, incisa nella Regola 2bis della mia governance agente :
| Stato | Definizione | Segnale LLM | Destinazione | | VISION | Architettura stabilizzata, pattern testato | Linguaggio dichiarativo, riferimenti sessioni/test | Diluizione completa + Blog | | STRATEGIA | Posizionamento business, pricing | Vocabolario di mercato, concorrenza | Solo doc root | | OPINIONE | Speculazione, ipotesi non validata | Linguaggio ipotetico, intuizione | Confinamento Cerchio 0 |
La combinazione delle due dimensioni — zona fisica × classificazione epistemica — forma lamatrice completaPlease provide the text you would like me to translate.
@startuml
skinparam backgroundColor #FEFEFE
title La Matrice Completa — Zona × Classificazione
salt
{
{T
+ Zone | VISION | STRATÉGIE | OPINION
+ Racine (0) | ✗ Interdit | ✗ Interdit | ✗ Interdit
+ configuration/ (1) | ✗ Interdit | ✗ Interdit | ✗ Interdit
+ office/ (2) | ✓ Docs + Blog | ✓ Docs seulement | ✗ Confiné
+ CSS/ (3) | ✓ Dataset privé | ✓ Dataset privé | ✗ Confiné
+ OSS/ (4) | ✓ Public libre | ✓ Public libre | ✓ Public libre
}
}
@enduml
Come il LLM consuma questa matrice
La matrice non è un documento che il LLM legge. È un vincolo implicita codificata nel vettore di contesto composito (EPIC 9 — in corso di implementazione).
Ecco cosa riceve l’LLM a ogni sessione:
VECTEUR COMPOSITE DE CONTEXTE
├── RAG pgvector → OSS/ + office/Vision
│ (similarité sémantique sur contenu publiable)
├── Knowledge Graph graphify → OSS/
│ (relations exactes entre artéfacts publics)
├── Knowledge Graph privé → CSS/
│ (relations entre code closed source — jamais exporté)
├── Métadonnées de zone → chaque fichier taggé par zone physique
│ (le LLM sait s'il est dans office/ ou OSS/)
└── Historique des décisions → WORKSPACE_VISION.adoc
(contexte temporel des arbitrages)
Concretamente, quando l’LLM mi dice:
Je vais indexer le contenu de edster/ pour enrichir le knowledge graph...
Il metadato di zona risponde ancora prima che l’LLM finisca la sua frase: edster/`è in`CSS/, livello 3 →accesso vietato al knowledge graph pubblico. Il RAG non lo vede. Il grafo non lo tocca. La risposta utente non non citarlo.
|
L’ontologia spaziale funziona come unapermessi Unixper i LLM. Non chiedete a un processo di essere prudente con`/etc/shadow`— gli negate l’accesso in lettura. Stesso principio. |
Implementazione: Gradle Task Tipizzati
La matrice non è una filosofia. È codice. Ecco il contratto di incarico Gradle che lo implementa:
abstract class ZoneAwareIndexer @Inject constructor(
private val rootDir: DirectoryProperty,
private val configServer: ConfigServerProperty // → configuration/
) : DefaultTask() {
@Input
val zoneFilter: SetProperty<Zone> = project.objects.setProperty(Zone::class.java)
@OutputFile
val ragIndex: RegularFileProperty = project.objects.fileProperty()
@TaskAction
fun index() {
val allowedPaths = zoneFilter.get().flatMap { it.resolve(rootDir.get()) }
val forbiddenPaths = Zone.RESTRICTED.resolve(rootDir.get())
+ Zone.INTIMATE.resolve(rootDir.get())
// Le RAG ne voit jamais configuration/ ni la racine
// CSS/ alimente un index privé, pas celui-ci
// office/ est filtré par le classifieur Vision/Opinion
}
}
enum class Zone {
INTIMATE, // Cercle 0 — racine
RESTRICTED, // Cercle 1 — configuration/
EDITORIAL, // Cercle 2 — office/
CLOSED_SOURCE, // Cercle 3 — foundry/private/
OPEN_SOURCE // Cercle 3 — foundry/public/
}
Il compito è testabile. È possibile scrivere un test che verifichi:
@Test
fun `le RAG n'indexe jamais configuration`() {
val index = ZoneAwareIndexer(rootDir, configServer)
index.zoneFilter.set(setOf(Zone.OPEN_SOURCE, Zone.EDITORIAL))
index.index()
assertThat(index.ragIndex).doesNotContain("configuration/")
}
@Test
fun `le code closed source est exclu du RAG public`() {
val index = ZoneAwareIndexer(rootDir, configServer)
index.zoneFilter.set(setOf(Zone.OPEN_SOURCE)) // OSS only
assertThat(index.ragIndex).doesNotContain("edster")
}
380 test, 380 SUPERATI. Come per plantuml-gradle — la sicurezza è testata, non sperata.
Perché è un Manifesto, non solo una Spec
Questo documento è una specifica di architettura perché definisce:
-
Desdimensioni(spaziale, epistemica)
-
Deiregole deterministiche(zona → diritto di accesso)
-
Un contratto d’opera(Gradle tipizzato, testabile)
-
Unaimplementazione di riferimento(il mio workspace)
Ma è anche unmanifestoperché prende posizione su un dibattito più ampio : come governare l’accesso di un LLM a dei dati?
La risposta dell’industria è il prompt engineering + i guardrails
i classificatori post-hoc. La mia risposta è: organizzate i vostri file in le cartelle corrette. Il resto è automatico.
|
Questo manifesto non dice "gli LLM devono essere allineati". Dice: "l’allineamento di un LLM sulle vostre regole di sicurezza è una conseguenza del vostro sistema di file, non del tuo prompt. |
La Cascata Completa — dal Brain Dump all’Articolo di Blog
Per illustrare il ciclo completo, ecco come è nata questa idea di matrice ed è stata diluita:
Session 4 mai 2026 — Feedback global du workspace
│
├→ Le LLM identifie : "la dualité public/privé est invisible"
│ → Classifié VISION (constat architectural vérifiable)
│
├→ PICTURE_ME_ROLLIN_MATRICE_4X4.adoc — STIMULUS (Cercle 0)
│ → Brain dump structuré, classification VISION confirmée
│
├→ DILUTION → WORKSPACE_AS_PRODUCT.adoc (section Matrice 4×4)
│ → La spec vit dans les documents racine
│
├→ DILUTION → WORKSPACE_ORGANIZATION.adoc (OSS/CSS)
│ → La granularisation est documentée
│
└→ ARTICLE 0117 (ce document) → cheroliv.com
→ La VISION est publiée
Quello che era iniziato come un’osservazione in sessione ("ehi, il RAG non sa che edster sia closed source") è diventata una specifica di architettura pubblicata in meno di una sessione. È il pattern STIMULUS in azione.
Pro/Contro
| Questo Approccio (Ontologia Spaziale + Matrice) | L’Approccio Classico (Prompt + Guardrails) |
|---|---|
Meccanica — il file system blocca l’accesso, non il LLM |
Dichiarativa — il prompt chiede al LLM di essere prudente |
Testabile — il contratto del task Gradle è verificato da più di 380 test |
Non testabile — "il LLM ha rispettato la regola?" è una domanda aperta |
Indipendente dal LLM — cambia modello, le cartelle rimangono |
Dipendente dal LLM — ogni modello interpreta il prompt in modo differente |
Scalabile — nuovo tipo di dati = nuova cartella, zero modifiche al codice |
Non scalabile — nuovo tipo di dati = nuova clausola di prompt, nuovo rischio di regressione |
Auditable — il file system è l’audit trail |
Non auditabile — il prompt non ha cronologia, nessun diff, nessun blame |
Vincolo: richiede una disciplina di organizzazione iniziale |
Vincolo: richiede una disciplina di redazione dei prompt a ogni sessione |
Conclusione: Organizzate i vostri File, non i vostri Prompt
La matrice di governance LLM che ho appena descritto non è un prodotto. È unaspecificazione dell’architettura— ed è per questo che lei è pubblicabile.
Ciò che la rende robusta è che non richiede nulla al LLM. Non gli non fidarsi. Non si basa sul suo allineamento, sulla sua comprensione del francese, o sulla sua buona volontà. Si basa sul file system — lo strato più basso, più stabile, più testato di tutta la stack.
Quando dico al mio LLM "puoi indicizzare tutto in`OSS/, nulla in `configuration/, et `office/`solo se è classificato Vision" — non è un’istruzione. È un filtro — implementato in Kotlin, verificato da 380 test, eseguito prima che l’LLM veda i dati.
È la differenza tra dire a qualcuno "non guardare in questo cassetto e chiudere il cassetto a chiave. La governance agent che sto costruendo da mesi è la chiave. La matrice è il piano del mobile.