tempo de leitura : 10 minutes

foundry/— a zona funcional que hospeda o código do meu workspace — contém 18 projetos. Oito são código aberto sob a licença Apache 2.0. Apenas um é closed source — o SaaS Edster. Durante meses, esses nove projetos coabitaram. na mesma pasta, separados apenas por…​ nada. O status público/privado deles era uma informação na minha cabeça, não no sistema de arquivos.

E então eu quis conectar um RAG. E aí, tudo desabou.

O acidente que esperava acontecer

Em abril de 2026, comecei a implementar o RAG pgvector para slider-gradle. O princípio: indexar todos os repositórios de`foundry/, produzir de embeddings, e injetá‑los no contexto do LLM para que ele tenha uma perception" do dossier`foundry/.

O pipeline era simples:

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)

Simples. Eficaz. Eperigoso.

Porque este`fileTree`não distingue entre`plantuml-gradle/` (Apache 2.0, public) e`edster/`(closed source, private). Ele engole tudo. E se um dia eu publicar estes embeddings — num dashboard, numa resposta LLM, em um conjunto de dados de treinamento — o código proprietário da Edster está vazando.

O problema não é que um LLM leia código fechado. O problema, é que esse código termine em um embedding vetorial público — irreversível, não removível, não auditável.

A Verdadeira Pergunta

Não é "como impedir que o LLM vazeie código?". É "como tornar a fuga estruturalmente impossível ?

A resposta não é um prompt. A resposta, é de cortar o dossier em dois.

A Solução: OSS/ e CSS/

Antes :

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

Após :

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

Le `fileTree`torna-se :

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é

O RAG público nunca vê`CSS/`. O código fechado alimenta um dataset privado de ajuste fino — um modelo interno que nunca sai da minha casa separação é mecânica, não declarativa.

Por que "OSS" e "CSS" e não "Public" e "Private

A escolha dos acrônimos OSS (Open Source Software) e CSS (Closed Source Software) é deliberado:

  • Public"/"Private" descreve ovisibilidade(o que o GitHub vê)

  • OSS"/"CSS" descreve anaturezado código (o que o LLM deve saber)

A visibilidade do GitHub é um metadado do repositório remoto. A natureza do código é O LLM não tem acesso à API do GitHub — mas ele tem acesso ao sistema de arquivos.CSS/`ele disse "atenção, este código não está sob licença livre" sem precisar ler um`LICENSE`ou analisar um`package.json.

O nome da pasta é o metadado mais robusto que você pode dar a um LLM. Ela não pode ser mal analisada, ignorada, ou mal interpretada. O LLM vê`CSS/edster/`no caminho do arquivo — ele sabe

A Árvore Completa — Quatro Zonas, Não Três

A granularização OSS/CSS complementa a ontologia de três zonas. A zona `foundry/`passa de 1 para 2 subzonas funcionais :

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

| Zone | RGPD | Indexação RAG pública | Ajuste fino do dataset | | Raiz | Nível 0 — Íntimo | ✗ | ✗ | | configuration/| Nível 1 — Restrito | ✗ | ✗ | | office/| Nível 2 — Colaborativo | ✓ Filtrado | ✓ Filtrado | |foundry/private/| Nível 3 — Abertura condicional | ✗ | ✓ Privado | (blank)`foundry/public/`Nível 4 — Público nativo | ✓ Livre | ✓ Público

O Caso Particular : cheroliv.com

Enquanto estava lá, corriji outra incoerência. Meu site cheroliv.com`morava em`foundry/`como um projeto de software de pleno direito — com seu próprio build Gradle, sua própria CI, sua própria governança.agents/`.

Mas os artigos de blog não são código. São dados editoriais** de Cercle 2 — da mesma forma que os enquadramentos de`office/pilotage/` ou as formações de`office/formations/`.

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

O que muda :

  • Os artigos estão em`office/`→ confidencialidade do Círculo 2

  • A tarefa`publishSite`torna-se uma capacidade de`engine`

via`bakery-gradle`— o plugin recebe um`FileTree`, ele não sabe que os artigos venham de`office/`

  • Um único CI, uma única governança — zero duplicação

  • O classificador Vision/Opinion (Regra 2bis) aplica-se automaticamente:

os artigos em`office/`são filtrados antes da publicação

bakery-gradle não liga

E é isso que é bonito. O plugin`bakery-gradle`não foi modificado. Ele recebe um diretório de conteúdo AsciiDoc, ele gera HTML, ele faz push no GitHub Pages. Que esse diretório se chame`site/jbake/content/` ou office/sites/cheroliv/— o plugin não se importa.

// 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
    }
}

O contrato de interface é uma tarefa Gradle. Não é uma API REST. Não é um webhook. Uma tarefa — tipada, testável, executável localmente e na CI.

Impacto sobre o Agente de Governança

A granularização OSS/CSS altera a governança do agente em três pontos:

  1. RAG public : o perímetro de indexação passa de`foundry/**`

à foundry/public/+office/Vision/. O código closed source é excluído do índice por configuração de tarefa, não por prompt.

  1. Knowledge Graph : o graphify-gradle produz dois grafos :

*office/graph.json(public) — relações entre artefatos OSS + office/Vision *configuration/graph_private.json(gitignored, privado) — relações entre artefatos CSS, nunca publicado

  1. ajuste fino do conjunto de dados :`codebase-gradle`agora tem duas fontes :

*OSS/→ datasets públicos (modelos comunitários, benchmarks) *CSS/→ datasets privados (modelo interno, fine-tuning proprietário)

O Que Se Ganha (E O Que Se Perde)

Antes (pasta plana)

Depois (OSS/CSS + office/sites)

ls foundry/→ mistura público/privado

ls foundry/public/→ tudo é publicável

RAG indexa tudo sem discriminação

RAG indexa`OSS/` + `office/Vision`exclusivamente

Impossível saber se um projeto é open source

O caminho`OSS/` ou `CSS/`o dito

cheroliv.com tem sua própria CI, sua própria governança

A CI e a governança são mutualizadas no engine

Os artigos de blog estão em um repositório "code

Os artigos do blog estão em`office/sites/`— dados, não código

Risco de vazamento de código fechado em embeddings públicos

Estruturalmente impossível —`CSS/`fora do escopo RAG

O único custo : um`git mv`global sobre os 17 repositórios OSS + um refatoramento do build.gradle.kts de engine. É uma migração a frio Sem dados em voo, nenhum usuário impactado.

Conclusão: o sinal físico bate o sinal de software

O que eu fiz nesta tarde foi substituir uma convenção invisível por uma separação visível na zona`foundry/. Antes, você tinha que saber que`edster/`era closed source. Agora você vê — o dossiê se chama`CSS/.

É o mesmo princípio que as permissões Unix, os VLAN de rede, ou os compartimentos à prova de fogo em uma base de dados. A segurança não deve ser uma informação que você deve reter. Ela deve ser uma propriedade físicado sistema.

A granularização OSS/CSS é a tradução deste princípio no domínio da governança LLM. O LLM não precisa saber que o Edster é Confidencial. Ele precisa ser incapaz de indexá-lo.

E isso é exatamente o que`CSS/`garante.

Articles connexes