Lesezeit : 10 minutes

foundry/— der funktionale Bereich, der den Code meines Arbeitsbereichs hostet — enthält 18 Projekte. Acht sind Open Source unter Apache 2.0. Nur einer ist closed source — der SaaS Edster. Über Monate hinweg haben diese neun Projekte koexistiert. im gleichen Ordner, getrennt nur durch…​ nichts. Ihr öffentlicher/privater Status Es war eine Information in meinem Kopf, nicht im Dateisystem.

Dann wollte ich ein RAG anschließen. Und dann ist alles zusammengebrochen.

Der Unfall, der darauf wartete, sich zu ereignen

Im April 2026 habe ich begonnen, das RAG pgvector für slider-gradle zu implementieren. Das Prinzip : alle Repositorys indexieren von`foundry/, produzieren Embeddings, sie in den Kontext des LLM einzufügen, damit es eine hat Perception" der Akte`foundry/`.

Die Pipeline war einfach:

val repos = fileTree(rootDir) {
    include("**/*.adoc", "**/*.kts", "**/*.kt", "**/*.json", "**/*.yml")
}
val chunks = repos.map { chunk(it) }
val embeddings = chunks.map { embed(it) }
pgvector.insert(embeddings)

Einfach. Effizient. Und.gefährlich.

Weil das`fileTree`macht keinen Unterschied zwischen`plantuml-gradle/` (Apache 2.0, public) und`edster/`(closed source, private). Er isst alles. Und wenn ich eines Tages diese Embeddings veröffentliche — auf einem Dashboard, in einer Antwort LLM, in einem Trainingsdatensatz — Edsters proprietärer Code läuft aus.

Das Problem ist nicht, dass ein LLM geschlossenen Quellcode liest. Das Problem, dass dieser Code in einem Vektor-Embedding öffentlich endet — irreversibel, nicht löschbar, nicht prüfbar.

Die wahre Frage

Es ist nicht "wie verhindert man, dass der LLM Code verliert?". Es ist "wie die Flucht strukturell unmöglich machen?

Die Antwort ist kein Prompt. Die Antwort ist, den Ordner in zwei Teile zu teilen.

Die Lösung: OSS/ und CSS/

Vorher:

foundry/
├── plantuml-gradle/       ← public
├── bakery-gradle/         ← public
├── magic-stick/           ← public
├── edster/                ← PRIVÉ
├── slider-gradle/         ← public
└── ...                    ← mélange invisible

Danach:

foundry/
├── OSS/                   ← tout est Apache 2.0
│   ├── plantuml-gradle/
│   ├── bakery-gradle/
│   ├── magic-stick/
│   ├── slider-gradle/
│   └── ...
└── CSS/                   ← tout est closed source / private
    └── edster/

Le `fileTree`wird :

val ossRepos = fileTree(File(rootDir, "OSS")) {
    include("**/*.adoc", "**/*.kts", "**/*.kt", "**/*.json", "**/*.yml")
}
val cssRepos = fileTree(File(rootDir, "CSS")) {
    include("**/*.adoc", "**/*.kts", "**/*.kt", "**/*.json", "**/*.yml")
}

// Embeddings publics — OSS seulement
pgvectorPublic.insert(ossRepos.map { chunk(it) }.map { embed(it) })

// Dataset fine-tuning privé — CSS seulement
fineTuningDataset.insert(cssRepos.map { chunk(it) })  // jamais publié

Der öffentliche RAG sieht nie`CSS/`. Der Closed-Source-Code speist einen Datensatz ohne Fine-Tuning — ein internes Modell, das mein Zuhause niemals verlässt. Die Trennung ist mechanisch, nicht deklarativ.

Warum "OSS" und "CSS" und nicht "Public" und "Private

Die Auswahl der Akronyme OSS (Open Source Software) und CSS (Closed Source Software) ist deliberiert :

  • Public"/"Private" beschreibt dieSichtbarkeit(was GitHub sieht)

  • OSS"/"CSS" beschreibt dasNaturdes Codes (was das LLM wissen muss)

Die GitHub-Sichtbarkeit ist eine Metadaten des entfernten Repos. Die Natur des Codes ist eine Eigenschaft des Inhalts. Der LLM hat keinen Zugriff auf die GitHub-API — aber er hat Zugriff dem Dateisystem.CSS/`Er sagt ihm: "Achtung, dieser Code steht nicht unter einer Lizenz. frei" ohne etwas lesen zu müssen ein`LICENSE`oder zum Parsen eines`package.json.

Der Name des Ordners ist das robusteste Metadatum, das Sie geben können zu ein LLM. Sie kann nicht falsch geparsed, ignoriert oder falsch interpretiert werden. Das LLM sieht`CSS/edster/`im Dateipfad — es weiß.

Der vollständige Baum — Vier Zonen, nicht drei

Die OSS/CSS-Granularisierung ergänzt die dreizonige Ontologie. Die Zone `foundry/`geht von 1 zu 2 funktionellen Unterzonen:

L’organisation de foundry/ en deux sous-zones OSS et CSS

| Zone | DSGVO | Indexierung RAG öffentlich | Datensatz-Feinabstimmung | | Wurzel | Ebene 0 — intim | ✗ | ✗ | | configuration/| Stufe 1 — Eingeschränkt | ✗ | ✗ | | office/| Level 2 — Kollaborativ | ✓ Gefiltert | ✓ Gefiltert | |foundry/private/| Stufe 3 — Bedingt geöffnet | ✗ | ✓ Privat | Veuillez fournir le texte français à traduire.foundry/public/| Stufe 4 — Einheimisches Publikum | ✓ Kostenfrei | ✓ Öffentlich |

Der Sonderfall : cheroliv.com

Während ich dort war, habe ich eine andere Inkonsistenz korrigiert. Meine Seite cheroliv.com`lebte in`foundry/`wie ein Softwareprojekt vollwertig — mit seinem eigenen Gradle-Build, seiner eigenen CI, seiner eigenen Governance.agents/`.

Aber Blog-Beiträge sind kein Code. Sie sind Daten. Editorial** von Cercle 2 — ebenso wie die Einrahmungen von`office/pilotage/` oder die Ausbildungen von`office/formations/`.

AVANT                            APRÈS
foundry/                office/
  cheroliv.com/                    sites/
    site/jbake/content/blog/         cheroliv.com/
      2026/0117_....adoc               2026/0117_....adoc

Was sich ändert:

  • Die Artikel sind in`office/`→ Vertraulichkeit des Kreises 2

  • Die Aufgabe`publishSite`wird eine Fähigkeit von`engine`

via`bakery-gradle`— das Plugin erhält ein`FileTree`, er weiß es nicht dass die Artikel von`office/`

  • Eine einzige CI, eine einzige Governance — null Duplikation

  • Der Vision/Opinion-Klassifikator (Regel 2bis) wird automatisch angewendet:

die Artikel in`office/`werden vor der Veröffentlichung gefiltert

bakery-gradle ist mir egal

Und das ist schön. Das Plugin`bakery-gradle`wurde nicht geändert. Er empfängt ein Verzeichnis mit AsciiDoc-Inhalt, er erzeugt HTML, er pusht Auf GitHub Pages. Dass dieses Verzeichnis heißt`site/jbake/content/` ou `office/sites/cheroliv/`Der Plugin scheißt darauf

// engine/build.gradle.kts
task("publishBlog") {
    doLast {
        val articles = fileTree("../../office/sites/cheroliv/2026/")
        bakery.generate(articles)  // ← bakery ne sait pas d'où ça vient
    }
}

Der Schnittstellenvertrag ist eine Gradle-Aufgabe. Keine REST-API. Kein Webhook. Eine Aufgabe — typisiert, testbar, lokal und in der CI ausführbar.

Auswirkung auf den Governance-Agent

Die OSS/CSS-Granularisierung ändert die Agenten-Governance an drei Punkten:

  1. RAG public : der Perimeter der Indexierung geht von`foundry/**`

à foundry/public/+office/Vision/. Der Closed-Source-Code wird aus dem Index durch die Aufgabenkonfiguration ausgeschlossen, nicht durch den Prompt.

  1. Knowledge Graph : graphify-gradle produziert zwei Graphen :

*office/graph.json(public) — Beziehungen zwischen OSS-Artefakten und office/Vision *configuration/graph_private.json(gitignored, privat) — Beziehungen zwischen CSS-Artefakte, nie veröffentlicht

  1. Datensatz-Feinabstimmung :`codebase-gradle`hat jetzt zwei Quellen:

*OSS/→ öffentliche Datensätze (Community-Modelle, Benchmarks) *CSS/→ private Datasets (internes Modell, proprietäres Fine-Tuning)

Was wir gewinnen (und was wir verlieren)

Vor (flacher Ordner)

Nach (OSS/CSS + office/sites)

ls foundry/→ öffentlicher/privater Mix

`ls foundry/public/`Alles ist veröffentlichbar

RAG indiziert alles ohne Diskriminierung

RAG indiziert`OSS/`+`office/Vision`ausschließlich

Es ist unmöglich zu wissen, ob ein Projekt Open Source ist.

Der Weg`OSS/` ou `CSS/`der genannte

cheroliv.com hat seine eigene CI, seine eigene Governance

Die CI und die Governance werden im Engine gemeinsam genutzt.

Die Blogartikel befinden sich in einem Repository "code".

Die Blogbeiträge sind in`office/sites/`— Daten, kein Code

Risiko eines Lecks von closed-source-Code in öffentlichen Embeddings

Strukturell unmöglich —`CSS/`außerhalb des Geltungsbereichs von RAG

Die einzige Kosten: ein`git mv`global über die 17 OSS-Repositorien + ein Refactoring des build.gradle.kts de engine. Es ist eine Kaltmigration— Keine Daten im Flug, keine betroffenen Benutzer.

Fazit: das physische Signal schlägt das logische Signal

Was ich diesen Nachmittag gemacht habe, ist, eine unsichtbare Konvention zu ersetzen. durch eine sichtbare Trennung in der Zone`foundry/. Früher mussten Sie wissen dass`edster/`war Closed Source. Jetzt sehen Sie es — Der Ordner heißt`CSS/.

Es ist das gleiche Prinzip wie die Unix-Berechtigungen, die Netzwerk-VLANs, oder die Brandschutzwände in einer Datenbank. Die Sicherheit muss nicht Es muss eine Information sein, die Sie behalten müssen. Sie muss eine Eigenschaft sein. physikalischdes Systems.

Die Granularisierung OSS/CSS ist die Übersetzung dieses Prinzips im Bereich der LLM-Governance. Das LLM muss nicht wissen, dass Edster ist vertraulich. Er muss unfähig sein, es zu indexieren.

Und das ist genau was`CSS/`garantiert.

Verwandte Artikel