Auditoria pré-abertura: fecha a derivação do held-out e prepara a comunidade - #1
Merged
Merged
Conversation
…enização Auditoria do repositório para abertura pública. A varredura de segredos saiu limpa (nenhum .env ou chave em nenhum dos 41 commits; held-out ausente de todas as árvores), mas encontrou um bloqueador estrutural registrado em docs/plano-abertura.md: o held-out é reconstruível byte a byte a partir do código público, porque a seed está literal em gerar-itens.ts e no teste. Verificado empiricamente. Correção depende de decisão do time e não entra aqui. Aplicado nesta branch (seguro e reversível): - CONTRIBUTING.md com a regra de instrumento de medição (rodadas publicadas são imutáveis; held-out não é liberado), SECURITY.md com canal privado tratando vazamento do held-out como vulnerabilidade, CODE_OF_CONDUCT.md do bncc-dados e templates de issue. - Manifestos deixam de gravar o caminho absoluto do home do mantenedor; o manifesto não participa do check de consistência, então nenhuma nota mudou. - ci.yml e validacao.yml eram duplicatas: consolidados em validacao.yml, com pin do pnpm e permissões mínimas. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…eção A avaliação anterior tratava o held-out atual como perdido e previa regeneração dos 300 itens. Errado: o repositório nunca foi público, então nada vazou e o conjunto atual continua válido. O conserto é esconder a seed (mantendo o valor) e limpar o histórico antes do flip, não regerar. Registra o método em quatro passos (seed para .env, teste sem a fórmula, higienização documental, git filter-repo), o custo inevitável da reescrita de histórico (todos os hashes mudam e harness_commit dos manifestos deixa de resolver; commit-map versionado como ponte) e a ressalva de que notas por item do held-out serviriam de gabarito para confirmar palpites de seed. Acrescenta a seção "O que abrir e o que não abrir": publicar prompt, resposta e julgamento do conjunto público é o objetivo do projeto, e é justamente o held-out que torna esse custo aceitável. O documento passa a descrever a derivação sem citar os valores — verificado. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
O gerador é determinístico, então a seed versionada permitia reconstruir o held-out item a item a partir do próprio repositório: proteger o arquivo (diretório externo + .gitignore) nunca protegeu a derivação. Pior, o teste "held-out não vaza" refazia a conta literalmente, sendo o mapa mais direto para chegar nele. O valor NÃO muda — o repositório nunca foi público, então o held-out atual segue válido e não precisa ser regerado. Verificado: com a seed vinda do .env, o held-out gerado é idêntico ao anterior item a item (só o carimbo gerado_em difere). - gerar-itens.ts lê SEED_HELDOUT do .env e falha com mensagem explícita se ausente; --sem-heldout segue gerando só o banco público. - gerador.test.ts passa a provar "seeds distintas geram bancos distintos" com seeds arbitrárias: a propriedade é genérica e não precisa das seeds reais. - README e docs/comecando.md orientam --sem-heldout, senão o quickstart quebra para quem não é mantenedor. - D5 registra a emenda e a consequência: do held-out publicam-se apenas agregados, nunca itens ou resultados item a item, que serviriam de gabarito para confirmar tentativas de adivinhação da seed. A seed pública (banco publicado) continua versionada de propósito: é o que torna o banco reproduzível por terceiros. Falta a limpeza do histórico: o valor ainda está em commits antigos e o repositório não pode ser aberto antes disso (docs/plano-abertura.md, A-1.4). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ao mover a seed para o .env, `pnpm gerar` passou a falhar para quem não tem a variável — ou seja, para todo contribuidor externo depois da abertura. O commit anterior contornou isso na documentação, o que é curativo: o caminho padrão continuava quebrado para a maioria, e ninguém lê a nota antes de rodar o primeiro comando. Inverte o padrão: `pnpm gerar` produz só o banco público e `pnpm gerar --com-heldout` regera também o privado. Além da ergonomia, o modo de falha fica melhor nos dois lados — esquecer a flag gera apenas o banco público (inofensivo), enquanto no desenho anterior esquecer significava erro para quem nunca poderia ter a seed. Descartada a alternativa de detectar a variável e pular o held-out em silêncio: um mantenedor com .env mal configurado acreditaria ter regerado o conjunto sem tê-lo feito, e descobriria só numa medição futura. Reverte as instruções de contorno no README e no comecando.md; a flag agora é mencionada só onde interessa ao mantenedor (.env.example e D5). Verificado: sem .env o comando padrão funciona; com --com-heldout e sem a variável falha com mensagem explícita; com a variável o held-out sai idêntico ao anterior item a item; e o comando padrão não toca o arquivo do held-out. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
marcosbeto
added a commit
that referenced
this pull request
Jul 27, 2026
Auditoria pré-abertura: fecha a derivação do held-out e prepara a comunidade
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Auditoria do repositório para abertura pública, com as correções seguras aplicadas.
O achado que trava a abertura
A varredura de segredos saiu limpa: nenhum
.envno histórico, nenhuma chave literal em 41 commits, nenhum held-out em nenhuma árvore, nenhuma PII nas 15.300 respostas. Mas o held-out era reconstruível byte a byte a partir do próprio repositório — o gerador é determinístico e a seed estava literal no código e no teste. Verificado empiricamente contra o arquivo real.Como o repositório nunca foi público, nada vazou: o held-out atual continua válido e não precisa ser regerado. Basta esconder a seed e limpar o histórico antes do flip.
O que este PR faz
SEED_HELDOUTno.env, sem trocar o valor. Verificado: o held-out gerado é idêntico ao anterior item a item.test/gerador.test.tsdeixa de codificar a fórmula — a propriedade é genérica e usa seeds arbitrárias. O teste que provava "não vaza" era o mapa para derivá-lo.--com-heldout): o caminho padrão precisa funcionar para quem não tem a seed, que será a maioria depois da abertura.CONTRIBUTING.mdcom a regra de instrumento de medição,SECURITY.md(vazamento do held-out como vulnerabilidade),CODE_OF_CONDUCT.mde templates de issue.harness/executar.ts.ci.ymlevalidacao.ymleram duplicatas: consolidados, com pin do pnpm e permissões mínimas.docs/plano-abertura.mdreescrito com achados, método de correção e checklist go/no-go — sem citar os valores da seed.O que este PR NÃO faz
A seed continua nos commits antigos. O repositório não pode ser aberto antes da reescrita do histórico (
git filter-repo), que é irreversível e exige força bruta coordenada: backup, force-push e reclone de todo o time. Está detalhada emdocs/plano-abertura.md(A-1.4 e A-1.5).Validação
pnpm typecheck, 67 testes e o check de consistência da rodada oficial verdes. Nenhuma nota publicada foi alterada.