iron-edge 2.1.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,63 @@
1
+ # Sandbox: um ambiente de teste com dado falso
2
+
3
+ > Procedimento do pacote **blindar-sistema**. Cria um lugar seguro para testar
4
+ > segurança e bug sem tocar em dado de gente real. É a TRAVA da etapa avançada
5
+ > (o teste ao vivo): nada que faça requisição real roda fora daqui.
6
+
7
+ ## Por que isto existe
8
+
9
+ A auditoria white-box (ler o código) é segura em qualquer lugar, não toca dado. Mas
10
+ na hora de PROVAR uma falha ao vivo, ou rodar a ferramenta externa opcional, você
11
+ precisa de um sistema que seja seu e onde, se algo vazar, vazou nome de mentira.
12
+ Testar contra produção com cliente real é o erro que este passo elimina.
13
+
14
+ ## A regra única e inegociável
15
+
16
+ > Só teste contra um sistema **seu**, em ambiente de **teste**, com **dado
17
+ > sintético** (inventado). Nunca produção. Nunca dado de gente real. Nunca site de
18
+ > terceiro. O teste ao vivo faz requisição real, por isso ele só roda aqui.
19
+
20
+ ## Como montar (escolha um caminho)
21
+
22
+ ### Caminho A: ambiente local (qualquer stack, é o padrão)
23
+
24
+ 1. Suba o sistema na sua máquina (localhost) apontando para um banco local ou de
25
+ teste, nunca para o banco de produção.
26
+ 2. Confirme, olhando a variável de ambiente ativa, que o banco NÃO é o de produção
27
+ antes de qualquer teste.
28
+ 3. Popule com dado sintético (Caminho C abaixo).
29
+
30
+ ### Caminho B: branch de teste do banco (se usa Supabase, requer plano pago)
31
+
32
+ O Supabase tem "branch": uma cópia isolada do banco para desenvolvimento, separada
33
+ da produção. ⚠️ Branching é recurso de plano pago, não existe no Free. Se você está
34
+ no Free, use o Caminho A (local).
35
+
36
+ 1. No painel do Supabase, crie uma branch de desenvolvimento do projeto.
37
+ 2. Aponte o ambiente de teste do app para a branch (as variáveis de ambiente da
38
+ branch, não as de produção).
39
+ 3. Popule a branch com dado sintético, nunca com um dump de produção com dado real.
40
+
41
+ ### Caminho C: semear dado sintético
42
+
43
+ Crie de 10 a 30 registros inventados, cobrindo os papéis que você quer testar (ex.:
44
+ dois usuários comuns para provar IDOR entre contas, um admin, alguns pedidos).
45
+
46
+ - Nomes, e-mails e telefones inventados (ex.: `teste1@exemplo.com`). Nunca reaproveite
47
+ dado de cliente de verdade "só para o teste".
48
+ - Se precisar de volume, um script de seed que gera os registros. Guarde o script
49
+ junto do projeto para recriar o sandbox quando quiser.
50
+
51
+ ## Checklist antes de testar ao vivo
52
+
53
+ - [ ] O alvo é um sistema meu (não de terceiro)
54
+ - [ ] O ambiente é de teste (local ou branch), confirmado pela variável de ambiente
55
+ - [ ] O banco tem SÓ dado sintético, nenhum registro de cliente real
56
+ - [ ] A URL do teste não é a de produção
57
+
58
+ ## Depois do teste
59
+
60
+ - Não deixe o sandbox exposto na internet com um proxy ligado.
61
+ - Se criou branch, apague ou pause quando terminar.
62
+ - O achado que você provou aqui vale para produção: leve o CONSERTO para produção,
63
+ nunca o teste.
@@ -0,0 +1,72 @@
1
+ # Tirar segredo do histórico do Git
2
+
3
+ > Procedimento do pacote **blindar-sistema**. Conduza uma etapa de cada vez,
4
+ > esperando o usuário terminar. Só se aplica a um repositório do próprio usuário.
5
+
6
+ ## Por que apagar o arquivo NÃO basta
7
+
8
+ Se uma chave foi commitada uma vez, ela continua no **histórico** do Git e em
9
+ qualquer clone ou fork, mesmo depois de você apagar o arquivo. A auditoria (veja
10
+ `kb/secrets.md`) aponta que vazou; tirar do passado é este procedimento.
11
+
12
+ ## Ordem certa (não inverta)
13
+
14
+ ### Passo 1: REVOGAR e gerar a chave de novo (PRIMEIRO, sempre)
15
+
16
+ Este é o passo que realmente protege. Enquanto a chave antiga for válida, ela está
17
+ comprometida, esteja no histórico ou não.
18
+
19
+ - Chave da API de IA (Claude/OpenAI): no painel do provedor, revogue a chave e gere
20
+ outra.
21
+ - Gateway de pagamento (Stripe/Mercado Pago): rotacione a chave secreta.
22
+ - Banco (Supabase service_role, senha do Postgres): rotacione no painel.
23
+ - Depois de gerar a nova, atualize a variável de ambiente no servidor e no deploy
24
+ (Vercel/host) ANTES de derrubar a antiga em produção, para não quebrar o sistema.
25
+
26
+ Se você não consegue gerar outra chave, resolva isso antes: uma chave que você não
27
+ sabe revogar é um risco em aberto.
28
+
29
+ ### Passo 2: Limpar o histórico
30
+
31
+ Só depois de revogada, remova o arquivo do histórico inteiro.
32
+
33
+ Ferramenta recomendada: `git filter-repo`.
34
+
35
+ **Instalar (escolha o seu sistema):**
36
+ - macOS: `brew install git-filter-repo`
37
+ - Windows: `pip install git-filter-repo` (precisa de Python)
38
+ - Alternativa oficial: veja docs.github.com, "Removing sensitive data".
39
+
40
+ **Rodar (uma linha por comando, vale para PowerShell também):**
41
+ ```
42
+ git filter-repo --invert-paths --path CAMINHO/DO/ARQUIVO-COM-SEGREDO
43
+ ```
44
+ Troque `CAMINHO/DO/ARQUIVO-COM-SEGREDO` pelo arquivo real (ex.: `.env`).
45
+
46
+ **Se não der para instalar o filter-repo** (máquina travada, sem Python, sem brew):
47
+ - Alternativa: **BFG Repo-Cleaner** (`bfg --delete-files .env`), precisa de Java.
48
+ - Se nada disso rodar agora, NÃO trave: o Passo 1 (revogar) já neutralizou a chave.
49
+ Marque o Passo 2 como tarefa e siga o guia oficial do GitHub depois. Chave
50
+ revogada no histórico é um registro morto, não um risco ativo.
51
+
52
+ ### Passo 3: Subir e avisar
53
+
54
+ ⚠️ O `git filter-repo` **remove o remote `origin` de propósito** (é uma trava de
55
+ segurança dele). Por isso um `git push` simples falha com "No configured push
56
+ destination". Religue o remote e suba tudo (uma linha por comando):
57
+ ```
58
+ git remote add origin URL-DO-SEU-REPOSITORIO
59
+ git push origin --force --all
60
+ git push origin --force --tags
61
+ ```
62
+ O `--all` e o `--tags` garantem que o segredo saia de todos os branches e tags, não
63
+ só do atual. Avise quem tem clone do repo para reclonar (o histórico mudou). Daí em
64
+ diante: **segredo só em variável de ambiente**, nunca no código, nunca no front-end.
65
+
66
+ ## Checklist
67
+
68
+ - [ ] Chave revogada e nova chave gerada
69
+ - [ ] Variável de ambiente atualizada no servidor/deploy
70
+ - [ ] Histórico limpo (ou tarefa marcada, se a ferramenta não rodou agora)
71
+ - [ ] Remote religado e `push --force --all --tags` feito, quem tem clone avisado
72
+ - [ ] `.env` no `.gitignore` para não repetir
@@ -171,6 +171,12 @@ Mandar junto **só a lista de âncoras que vale** para o tipo da peça (seção
171
171
  - ★ **DADOS**: números conferidos contra a fonte crua (export, API, planilha); as somas fecham; períodos corretos.
172
172
  - **CLAREZA**: quem lê entende sem tradução?; a decisão recomendada está explícita?; zero jargão vazio.
173
173
 
174
+ ⚠️ **Relatório de tráfego pago: a medição desce ao nível do anúncio, sempre.** Auditar no nível da campanha deixa passar o defeito mais caro que existe nesse tipo de peça. Três regras, todas medidas contra a API, nunca contra o status:
175
+ 1. **Toda peça que o relatório diz estar "no ar" precisa ter impressão > 0 no período.** `effective_status = ACTIVE` não prova veiculação — em 02/09/2026, quatro anúncios ativados no dia anterior estavam todos ACTIVE e só dois entregavam. Campo ausente na resposta da API significa zero, não "não medido". **E a janela da consulta faz parte da medição:** `date_preset: "last_7d"` exclui o dia corrente e faz peça que está entregando aparecer com zero — foi assim que uma auditoria acusou como parado um anúncio com 63 impressões.
176
+ 2. **Toda data citada no relatório bate com a data vigente da ficha do cliente** (bloco "Informação que vence"). Data futura não é sinônimo de data válida: a vaga pode ter fechado antes.
177
+ 3. **O período do relatório é o mesmo em todos os blocos**, ou a divergência está escrita na peça. Mídia por ciclo de veiculação e negócio por mês-calendário podem conviver — desde que o leitor saiba.
178
+ Caso que originou a regra: um painel de cliente afirmava "anúncios novos no ar" enquanto as quatro peças novas tinham R$ 0,00 e zero impressão, e R$ 918,59 do mês haviam sido gastos com a arte da data anterior. Três lentes aprovaram o texto; quem pegou foi a medição por anúncio.
179
+
174
180
  ### DOCUMENTO (PDF, proposta, contrato, apostila) — âncoras lista A
175
181
  - ★ **FATOS**: todo número, preço, nome, data e promessa conferido contra a fonte (contrato, sistema, memória do projeto).
176
182
  - **FORMA**: fundo e identidade corretos (do cliente, não de quem produziu); anti-vícios de IA (travessão, "não é X, é Y", negação dramática); ortografia; paginação (rodapé que vira página órfã).