CL-2026-03-19-BK-145 · Auditor Diário Read-Only do RioNoTeatro
Escopo: cerebro-kernel (multi-projeto)
Projetos afetados: cerebro-kernel
Aprovação humana obrigatória: não
Resumo
Criado um auditor diário read-only que analiza a árvore do repositório /www/wwwroot/rionoteatro.com.br e envia relatório para o WhatsApp do admin quando há achados. O auditor nunca move, apaga ou edita arquivos.
Entregas
1. Motor Node.js — scripts/auditor_rnt.js
Scanner com 5 categorias de detecção:
| Categoria | O que detecta | Status |
|---|---|---|
| md_fora_docs | .md fora de docs/ | ✅ implementado |
| bk_fora_backlog | BK-* fora de docs/backlog/ ou docs/changelog/ | ✅ implementado |
| sensivel_raiz | arquivos sensíveis na raiz (.env, .json suspeito, nomes com CREDENCIAL/SENHA/TOKEN/RELATORIO/EXPOSTA) | ✅ implementado |
| backup_fora_pasta | backups/temporários fora de backups/ ou admin/cron/backups/ | ✅ implementado |
| orfanhos | PHPs sem referência em require/include (capped a 10) | ✅ implementado |
- Saída: JSON estruturado em stdout
- Exit code 1 se houver achados, 0 se silêncio
- Flags:
--dry-run,--verbose,--report-file <path>
2. Wrapper Shell — scripts/auditor_rnt.sh
- Log em
/www/server/cron/auditor_rnt.log - Cooldown anti-duplicado: 23h por padrão (1x/dia)
- WhatsApp via API local
http://127.0.0.1:3033/send --dry-run: análise sem envio--force-report: resumo diário mesmo sem achados- Formatador de mensagem legível para WhatsApp
3. Whitelist — kernel/config/auditor_rnt_excludes.json
Configuração JSON com:
patterns: globs de exclusão (.bak,_bkp,.tmp, etc.)paths: diretórios ignorados (tooling, vendor, uploads, etc.)md_exceptions:.mdindividuais permitidos na raizsize_threshold_kb: ignora arquivos grandes
Padrões já excluídos: .agent/, .context/, .github/, .claude/, AutoZap_Docs/, PagSeguroLibrary/, fancybox/, bot/, admin/js/ckeditor/, apps/Helpers/PHPMailer/, SQL/V2026/, etc.
4. Cron — /etc/cron.d/auditor_rnt
```
0 7 * root /root/cerebro/scripts/auditor_rnt.sh
```
Executa 1x ao dia às 7h. WhatsApp enviado apenas se houver achados ou com --force-report.
Achados encontrados na primeira execução
| Categoria | Quantidade |
|---|---|
| .md fora de docs/ | 2 (CREDENCIAIS_EXPOSTAS_RELATORIO.md, implementation_plan.md) |
| BK-* fora de docs/backlog/changelog/ | 9 |
| Arquivos sensíveis na raiz | 5 (.env, algolia_payload.json, BK-* com senha no nome) |
| Backups fora de pasta | 0 |
| Possíveis órfãos | 10 |
Total: 26 achados acionáveis
Validação
node --check scripts/auditor_rnt.js→ ✅ OKbash -n scripts/auditor_rnt.sh→ ✅ OKnode scripts/auditor_rnt.js --dry-run→ ✅ 26 achados, JSON limpobash scripts/auditor_rnt.sh --dry-run→ ✅ log OK, silêncio no WhatsAppgit statusantes/depois → ✅ idêntico (read-only confirmado)- Cron entry em
/etc/cron.d/auditor_rnt→ ✅ registrado
Arquivos criados/modificados
| Arquivo | Ação |
|---|---|
| scripts/auditor_rnt.js | novo (294 linhas) |
| scripts/auditor_rnt.sh | novo (183 linhas) |
| kernel/config/auditor_rnt_excludes.json | novo (47 linhas) |
| docs/backlog/BK-145-auditor-diario-rnt.md | novo (spec) |
| docs/BACKLOG.md | atualizado (BK-145) |
| docs/LOCK.md | atualizado (locks BK-145) |
| /etc/cron.d/auditor_rnt | criado (cron 7h) |
Correções pós-entrega (2026-03-19 tarde)
1. Remoção de segredo hardcoded
WHATSAPP_API_KEYremovida do shell script — agora obrigatória via variável de ambientesend_whatsapp()falha com log claro se a chave não estiver definida- curl agora detecta HTTP 4xx/5xx como falha (
-w '%{http_code}'+http_code >= 400→ exit 1)
2. scanMdOutsideDocs() respeita md_exceptions do arquivo de config
implementation_plan.mdagora é filtrado viaconfig.md_exceptions(não mais por código hardcoded)- Qualquer
.mdlistado emmd_exceptionsno JSON é исключён automaticamente
3. scanSensitiveAtRoot() restrito a alta confiança
- Padrões genéricos removidos (SENHA, PASSWORD, TOKEN, RELATORIO, PRIVATE)
- Padrões de alta confiança mantidos:
.env,CREDENCIAIS_EXPOSTA,API_KEY,SECRET - BK-*.md removidos deste scanner (já cobertos por
bk_fora_backlog) - Motivo justificado por item (não mais genérico "padrão sensível")
Resultado pós-correção (dry-run)
| Categoria | Antes | Depois |
|---|---|---|
| md_fora_docs | 2 | 1 (implementation_plan.md saiu) |
| sensivel_raiz | 5 | 3 (BK-*.md saiu, CREDENCIAIS_EXPOSTAS com razão explícita) |
| Total | 26 | 23 |
sensivel_raiz restante: .env (alta confiança), CREDENCIAIS_EXPOSTAS_RELATORIO.md (exposição explícita), algolia_payload.json (JSON na raiz)
Validações executadas
node --check scripts/auditor_rnt.js→ ✅ OKbash -n scripts/auditor_rnt.sh→ ✅ OK- dry-run:
implementation_plan.mdfora demd_fora_docs→ ✅ ausente - dry-run: BK-*.md fora de
sensivel_raiz→ ✅ nenhum aparece - dry-run: contagens verificadas → ✅ 23 achados em 5 categorias