Skip to content

Auditoria pré-abertura: fecha a derivação do held-out e prepara a comunidade - #1

Merged
marcosbeto merged 4 commits into
mainfrom
abertura/auditoria-pre-flip
Jul 27, 2026
Merged

Auditoria pré-abertura: fecha a derivação do held-out e prepara a comunidade#1
marcosbeto merged 4 commits into
mainfrom
abertura/auditoria-pre-flip

Conversation

@marcosbeto

Copy link
Copy Markdown
Contributor

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 .env no 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 do held-out sai do código para SEED_HELDOUT no .env, sem trocar o valor. Verificado: o held-out gerado é idêntico ao anterior item a item.
  • test/gerador.test.ts deixa 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.
  • Geração do held-out vira opt-in (--com-heldout): o caminho padrão precisa funcionar para quem não tem a seed, que será a maioria depois da abertura.
  • CONTRIBUTING.md com a regra de instrumento de medição, SECURITY.md (vazamento do held-out como vulnerabilidade), CODE_OF_CONDUCT.md e templates de issue.
  • Caminho absoluto do home do mantenedor removido dos manifestos (23 ocorrências); origem corrigida em harness/executar.ts.
  • ci.yml e validacao.yml eram duplicatas: consolidados, com pin do pnpm e permissões mínimas.
  • docs/plano-abertura.md reescrito 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 em docs/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.

marcosbeto and others added 4 commits July 26, 2026 22:24
…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
marcosbeto merged commit e0151fb into main Jul 27, 2026
1 check passed
@marcosbeto
marcosbeto deleted the abertura/auditoria-pre-flip branch July 27, 2026 03:16
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant