tempo di lettura : 14 minutes

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:

  1. 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

  1. # 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

configuration/

1 — Proprietà ristretta

Secret, token, chiavi API

VIETATO— mai indexato

office/

2 — Ristretto collaborativo

Dati editoriali, inquadramento, formazioni

FILTRATO— Solo visione

foundry/private/

3 — Aperto condizionale

Codice closed source, SaaS non pubblico

VIETATO— dataset privato esclusivamente

foundry/public/

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.

Articoli correlati