ehopent · roadmap
Construção ao vivo
O roadmap mora no código, não num quadro paralelo. Toda tarefa marcada como pronta aponta para arquivos que precisam existir — o CI derruba o build se este painel mentir.
tarefas concluídas
77/94
sprints completos
13/23
Sprint atual
S11
Atualizado em 2026-09-22
- S0Completo
Fundação
Esqueleto seguro: repo, CI com SAST e SCA, domínio tipado, portões de segurança.
100%- S0-1Monorepo tipado (core, engine, roadmap, api, web)
package.jsonpackages/core/src/index.tspronto - S0-2CI: lint, typecheck, teste e SCAO CodeQL saiu em 29/09: a licença gratuita só cobre código aberto. A varredura de código volta com motor de licença aberta (S7-6).
.github/workflows/ci.ymlpronto - S0-3Modelo de certeza: confirmado, provável, descartado, não-testado
packages/core/src/certainty.tspackages/core/src/finding.test.tspronto - S0-4Portão de consentimento assinado, preso à origem e revogável
packages/core/src/consent.tspackages/core/src/consent.test.tspronto - S0-5Portaria anti-SSRF de alvo
packages/core/src/target.tspackages/core/src/target.test.tspronto - S0-6Redação de evidência e sanitização de log
packages/core/src/redaction.tspackages/core/src/redaction.test.tspronto - S0-7Mapa de jurisdições com negação por padrão
packages/core/src/scope.tspackages/core/src/scope.test.tspronto - S0-8Esquema Postgres com trilha append-onlyO schema.sql original nunca rodou; refeito e ligado no S10 (ADR 0004). RLS por requisição é o S10-6.
apps/api/src/db/migrations/0001_inicial.sqlpronto - S0-9Auth OIDC com MFA verificada contra provedor externoVerificamos o token do provedor; não emitimos credencial. Em produção o processo não sobe sem OIDC_ISSUER.
apps/api/src/auth/oidc.tsapps/api/src/auth/oidc.test.tsapps/api/src/config.test.tspronto
- S0-1Monorepo tipado (core, engine, roadmap, api, web)
- S1Completo
Motor passivo
Ler o que já é público e levantar sinal, sem tocar na maçaneta.
100%- S1-1Orquestrador passivo com orçamento de requisições
packages/engine/src/passive/runner.tspackages/engine/src/passive/runner.test.tspronto - S1-2Check de cabeçalhos de segurança
packages/engine/src/checks/securityHeaders.tspronto - S1-3Catálogo de segredos expostos em bundle
packages/engine/src/checks/exposedSecrets.tspackages/engine/src/checks/exposedSecrets.test.tspronto - S1-4Arquivos públicos que não deviam estar públicos
packages/engine/src/checks/exposedFiles.tspronto - S1-5Impressão digital de backend para teste de RLS
packages/engine/src/checks/backendFingerprint.tspronto - S1-6CORS e cookies frouxos
packages/engine/src/checks/corsAndCookies.tspronto - S1-7Prova auto-verificável no domínio do dono
packages/engine/src/checks/exposedFiles.tspackages/core/src/target.tspronto - S1-8Sonda nos apps próprios (Fase 0)6 apps varridos em 22/09: 1 com falha confirmada, 5 com sinal provável. A sonda achou um furo no próprio motor (config Firebase minificada escapava) — corrigido.
tools/sonda.tstools/sonda.targets.tsdocs/sonda/2026-09-22.mdpronto
- S1-1Orquestrador passivo com orçamento de requisições
- S2Completo
Verificador self-serve e i18n
O dono cola a URL e recebe valor grátis, em 5 idiomas. Legal em qualquer país.
100%- S2-1API de varredura com portaria de consentimento
apps/api/src/routes/scans.tsapps/api/src/routes/scans.test.tspronto - S2-2Tela A: colar o link e verificar de graça
apps/web/src/app/[locale]/verificar/page.tsxpronto - S2-3Tela B: posse e consentimento, recusar e aceitar com o mesmo peso
apps/web/src/components/ScanConsole.tsxpronto - S2-4Tela C: resultado honesto com prova e prompt de correção
apps/web/src/components/ResultReport.tsxpronto - S2-5i18n em 5 idiomas desde o início
apps/web/messages/pt.jsonapps/web/messages/en.jsonapps/web/messages/es.jsonapps/web/messages/de.jsonapps/web/messages/fr.jsonpronto - S2-6security.txt e página /security publicadas
apps/web/public/.well-known/security.txtapps/web/src/app/[locale]/security/page.tsxpronto - S2-7Painel de sprints vivo, verificado no CI
apps/web/src/app/[locale]/sprints/page.tsxpackages/roadmap/src/verify.tspronto - S2-8Contrato de i18n: toda chave do motor traduzida nos 5 idiomasParidade de chave e de variável ICU. Check novo sem tradução derruba o build.
apps/web/src/i18n/messages.test.tspronto
- S2-1API de varredura com portaria de consentimento
- S3Completo
Relatório, billing e preço
Monetizar: scan profundo pós-consentimento, relatório de US$ 49 (US$ 99 até 28/09), selo e reteste.
100%- S3-1Worker ativo com bateria real de RLS, só com token de consentimentoTeste ativo de RLS no Supabase e endpoints sem auth. Guarda nome e contagem, nunca o conteúdo. Um teste prova que nada roda sem consentimento válido.
packages/engine/src/active/runner.tspackages/engine/src/active/runner.test.tspackages/engine/src/checks/supabaseRls.tspackages/engine/src/checks/supabaseRls.test.tspackages/engine/src/checks/openEndpoint.tspronto - S3-2Tela D: consentimento do scan profundo, revogávelRecusar e aceitar com o mesmo peso; o texto exibido é o texto registrado.
apps/web/src/components/DeepConsent.tsxpronto - S3-3Tela E: paywall honesto, preço completo antes do clique
apps/web/src/app/[locale]/precos/page.tsxapps/api/src/routes/billing.tspronto - S3-4Tela F: relatório pago, com o que ficou fora do escopo
apps/web/src/components/ReportView.tsxapps/api/src/services/reportService.tspronto - S3-5Billing, oferta anual no checkout e cancelamento em 1 cliquePreço confirmado tem de bater com o catálogo; cancelamento é DELETE direto, sem funil de retenção. Desconto só no anual.
packages/core/src/billing.tspackages/core/src/billing.test.tsapps/api/src/routes/billing.tsapps/api/src/routes/billing.test.tspronto - S3-6PDF do relatório e selo verificável com dataSelo assinado, datado, conferível sem login — nunca afirma "seguro". Relatório exporta em PDF com folha de impressão clara.
packages/core/src/badge.tspackages/core/src/badge.test.tsapps/api/src/routes/badge.tsapps/web/src/components/BadgeChecker.tsxapps/web/src/app/[locale]/selo/page.tsxapps/web/src/app/globals.csspronto
- S3-1Worker ativo com bateria real de RLS, só com token de consentimentoTeste ativo de RLS no Supabase e endpoints sem auth. Guarda nome e contagem, nunca o conteúdo. Um teste prova que nada roda sem consentimento válido.
- S4Completo
Monitor recorrente
LTV: vigia o app a cada mudança e avisa quando algo novo abrir.
100%- S4-1Agendamento e fila de verificação leve diáriaO monitor roda só a varredura PASSIVA: recorrente e ativo juntos são a receita do tráfego indesejado. Um alvo fora do ar é reagendado, não trava a fila.
apps/api/src/services/monitorService.tsapps/api/src/services/monitorService.test.tsapps/api/src/plugins/scheduler.tspronto - S4-2Alertas e histórico de 90 e 180 diasAlerta só nasce quando algo ABRE — diff por digital entre execuções. Retenção aparada por plano a cada gravação.
packages/core/src/monitor.tspackages/core/src/monitor.test.tsapps/web/src/components/MonitorPanel.tsxapps/web/src/app/[locale]/monitor/page.tsxpronto - S4-3Gatilho de deploy e webhook no plano PlusWebhook passa pela mesma portaria anti-SSRF que um alvo e recebe só chave e severidade, nunca evidência. Pedir no Essential é 400, não silêncio.
apps/api/src/routes/monitors.tsapps/api/src/routes/monitors.test.tspronto
- S4-1Agendamento e fila de verificação leve diáriaO monitor roda só a varredura PASSIVA: recorrente e ativo juntos são a receita do tráfego indesejado. Um alvo fora do ar é reagendado, não trava a fila.
- S5Completo
Infra de e-mail
Entregabilidade e anti-phishing: sem isto o aviso vira spam ou parece golpe.
100%- S5-1Contrato de DNS (SPF, DKIM, DMARC) e verificador da postura realnpm run email:dns lê o DNS real e imprime o que falta, na ordem. Publicar os registros é P4.
packages/disclosure/src/dns.tspackages/disclosure/src/dns.test.tstools/email-dns.tsdocs/email/runbook.mdpronto - S5-2Conformidade bulk sender em código: unsubscribe 1 clique, reclamação < 0,3%, supressão, lint do proibidoassertMayDisclose lança com o motivo exato. Sem provedor configurado o envio é 503, nunca silencioso.
packages/disclosure/src/compliance.tspackages/disclosure/src/compose.tspackages/disclosure/src/compose.test.tsapps/api/src/routes/disclosure.tsapps/api/src/routes/disclosure.test.tspronto - S5-3Warmup: rampa determinística com teto diário aplicado pelo portãoExecutar a rampa ao longo de 4 semanas é P5; o código recusa o envio que passar do teto.
packages/disclosure/src/warmup.tspackages/disclosure/src/compliance.test.tspronto - S5-4BIMI: SVG Tiny P/S do monograma validado e publicado; registro DNS geradoCertificado VMC/CMC é compra — P6.
packages/disclosure/src/bimi.tsapps/web/public/bimi.svgtools/write-bimi.tspronto - S5-5Templates de aviso com prova auto-verificável e CTA para o grátisCopy pronta, sem preço e sem prazo curto. O envio depende de S5 e S6.
docs/disclosure/templates.mdpronto
- S5-1Contrato de DNS (SPF, DKIM, DMARC) e verificador da postura realnpm run email:dns lê o DNS real e imprime o que falta, na ordem. Publicar os registros é P4.
- S6Completo
Disclosure autorizado
Ligar o Motor 1: aviso por prova, trilha de consentimento e 90 dias. Brasil, depois EUA.
100%TravaSó liga depois de S2 mostrar munição real E parecer jurídico local por escrito.
- S6-1Motor passivo em escala: fila com orçamento GLOBAL de plataformaTeto de concorrência, por minuto e por dia — impede que "em escala" vire tráfego que pareça ataque. Autenticado; cada alvo passa pela portaria anti-SSRF. O ENVIO só liga com o parecer (gate do S6).
packages/engine/src/queue/budget.tspackages/engine/src/queue/scanQueue.tspackages/engine/src/queue/queue.test.tsapps/api/src/routes/queue.tsapps/api/src/routes/queue.test.tspronto - S6-2Portão de país no envio, com negação por padrão
packages/core/src/scope.tspackages/core/src/scope.test.tspronto - S6-3Trilha de envio append-only: a defesa jurídica do Motor 1Cada estágio grava (preview/sent/suppressed/blocked/unsubscribed/complained): quem autorizou, país, parecer, prova, prazo, e o motivo quando NÃO foi. E-mail só por hash. Rota /v1/disclosures/trail responde a um regulador.
packages/disclosure/src/trail.tspackages/disclosure/src/trail.test.tsapps/api/src/routes/disclosure.tspronto
- S6-1Motor passivo em escala: fila com orçamento GLOBAL de plataformaTeto de concorrência, por minuto e por dia — impede que "em escala" vire tráfego que pareça ataque. Autenticado; cada alvo passa pela portaria anti-SSRF. O ENVIO só liga com o parecer (gate do S6).
- S7Completo
Robustez
Blindagem: isolamento reforçado, pen-test da própria plataforma, observabilidade.
100%- S7-1Worker efêmero por job, sob gVisor, sem banco — dois portões de consentimentoFlags de endurecimento travados por teste. Instalar runsc no host é P7.
packages/engine/src/worker/container.tspackages/engine/src/worker/worker.test.tsapps/worker/Dockerfiledocker-compose.ymldocs/adr/0003-worker-efemero-dois-portoes.mdpronto - S7-2Pen-test automatizado da própria plataforma, verde no CISSRF, IDOR, adulteração de token, entrada hostil, cabeçalhos, CORS, limite de taxa. Pen-test humano externo é P8.
apps/api/src/pentest/attack-surface.test.tsapps/api/src/pentest/hardening.test.tsdocs/pentest/2026-09-22.mdpronto - S7-3Observabilidade: request-id, log sanitizado, /metrics protegido, retenção agendadaVarredura sem relatório pago expira em 7 dias. Consentimento e auditoria nunca expiram: são a defesa jurídica.
apps/api/src/plugins/observability.tsapps/api/src/routes/ops.tsapps/api/src/services/retention.tsapps/api/src/services/retention.test.tspronto - S7-4Limite de taxa e orçamento por alvo
packages/engine/src/http/budget.tspackages/engine/src/http/budget.test.tspronto - S7-6Varredura de código no CI com motor de licença aberta: alerta novo reprova o buildO CodeQL rodou em 29/09 e foi desligado no mesmo dia (licença gratuita só cobre código aberto). No lugar, o motor do S18-1: 4 alertas conhecidos na ehopent, todos alarme falso com o motivo registrado.
.github/workflows/ci.ymltools/varrer-codigo.tstools/codigo-conhecidos.jsonpronto - S7-5Expressões do motor resistem a HTML hostil (ReDoS em passive/snapshot.ts, achado do CodeQL)Leitura em passada única: a página hostil de 350 KB caiu de ~13 s para milissegundos. De quebra: fechamento "</script >" e src sem aspas, que o motor perdia.
packages/engine/src/passive/snapshot.tspackages/engine/src/passive/snapshot.test.tspronto
- S7-1Worker efêmero por job, sob gVisor, sem banco — dois portões de consentimentoFlags de endurecimento travados por teste. Instalar runsc no host é P7.
- S8Completo
Login
O dono entra, e a sessão dele chega à API: teste profundo, relatório completo e monitor deixam de responder 401.
100%- S8-1Telas de entrar e cadastrar (Clerk) nos 5 idiomas, com a identidade da marcaSem chave configurada o site segue inteiro e a tela diz que o login não está disponível.
apps/web/src/components/auth/AuthScreen.tsxapps/web/src/components/auth/clerkTheme.tsapps/web/src/app/[locale]/entrar/[[...entrar]]/page.tsxapps/web/src/app/[locale]/cadastro/[[...cadastro]]/page.tsxpronto - S8-2Token de sessão (com aud da API) em toda chamada autenticada; CSP aberta só para a instânciaHost do Clerk lido da chave publicável e validado — chave adulterada não injeta fonte na CSP.
apps/web/src/components/auth/ApiAuth.tsxapps/web/src/lib/clerk.tsapps/web/src/lib/clerk.test.tspronto - S8-3Segundo fator do Clerk (claim fva) reconhecido pela APIMFA no Clerk é recurso do plano Pro: produção exige o upgrade antes de abrir.
apps/api/src/auth/oidc.tsapps/api/src/auth/oidc.test.tspronto - S8-4Fluxo autenticado ponta a ponta com conta real (entrar → teste profundo → selo)Teste real revelou e fechou 3 defeitos (token sem fva, POST vazio, 401 sem motivo no log). MFA desligado só no local, por decisão do dono.
docs/login/2026-09-24-fluxo-real.mdapps/web/src/lib/api.tspronto
- S8-1Telas de entrar e cadastrar (Clerk) nos 5 idiomas, com a identidade da marcaSem chave configurada o site segue inteiro e a tela diz que o login não está disponível.
- S9Completo
Relatório honesto
O relatório completo responde a toda pergunta que o gratuito deixou em aberto — nunca parece limpo por omissão.
100%- S9-1Prováveis do passivo entram no relatório profundo como confirmado, descartado ou não testadoAchado no teste real de 24/09: 2 prováveis no gratuito, 0/0/0 no completo. RLS agora registra "testado e fechado"; queda ou tabela além do teto = inconclusivo, não descarta.
packages/engine/src/active/reconcile.tspackages/engine/src/active/reconcile.test.tsapps/api/src/routes/deepReport.test.tspackages/engine/src/checks/supabaseRls.test.tspronto - S9-2Relatório em três listas: corrigir, ainda sem resposta, testado e descartado — lista vazia diz "nada a corrigir"
apps/web/src/components/ReportView.tsxapps/web/src/i18n/messages.test.tspronto - S9-3Relatório conferido com o app real do donoFirebase e chave Google aparecem como não testados — não há teste ativo para eles ainda.
docs/relatorio/2026-09-25-s9-app-real.mdpronto - S9-4Gravidade e certeza separadas: fora do confirmado, "alta se confirmado" com ponto vazado; fato vem antes de perguntaSubstitui o teto "provável no máximo média" (parecer externo, 28/09). O alerta do monitor só conta o confirmado na "pior gravidade".
packages/core/src/finding.tsapps/web/src/lib/severityLabel.tsapps/web/src/lib/severityLabel.test.tsapps/web/src/components/ui.tsxpronto
- S9-1Prováveis do passivo entram no relatório profundo como confirmado, descartado ou não testadoAchado no teste real de 24/09: 2 prováveis no gratuito, 0/0/0 no completo. RLS agora registra "testado e fechado"; queda ou tabela além do teto = inconclusivo, não descarta.
- S10Completo
Banco de dados
Nada se perde num reinício: conta, autorização, relatório e monitor vivem no Postgres, com as travas no próprio banco.
100%- S10-1Esquema alinhado ao que a API guarda, em migrações versionadas (ADR 0004)O schema.sql antigo nunca rodou e não batia com as portas: id do Clerk é texto, e metade dos repositórios não tinha tabela.
apps/api/src/db/migrations/0001_inicial.sqlapps/api/src/db/migrate.tsdocs/adr/0004-postgres-alinhado-as-portas.mdpronto - S10-2Adaptador Postgres dos 10 repositórios, provado pela MESMA bateria de contrato do adaptador em memóriaA bateria achou uma divergência real: a memória deixava trocar a data de revogação. Corrigido nos dois.
apps/api/src/repositories/postgres.tsapps/api/src/repositories/contract.test.tspronto - S10-3Travas no banco: autorização, auditoria e trilha de envio não se apagam nem se reescrevem
apps/api/src/db/invariants.test.tsapps/api/src/db/migrations/0002_papeis.sqlpronto - S10-4API usa o banco quando há DATABASE_URL; produção recusa subir sem ele; CI roda contra Postgres real
apps/api/src/db/pool.tsapps/api/src/config.test.ts.github/workflows/ci.ymlpronto - S10-5Conferido com o dono: relatório reabre depois de reiniciar a API
docs/relatorio/2026-09-25-s10-reinicio.mdpronto - S10-7Tela "Meus relatórios": lista do dono e reabrir cada relatórioAchado ao planejar o S10-5: quem pagava e fechava a aba não tinha como ver o relatório de novo.
apps/web/src/components/ReportsList.tsxapps/web/src/components/SavedReport.tsxapps/api/src/routes/deepReport.test.tsapps/api/src/db/migrations/0003_relatorios_por_dono.sqlpronto - S10-6RLS por requisição (defesa em profundidade além da checagem de dono na API)Feito em 05/10 (ADR 0006): RLS com FORCE nas 8 tabelas com dono; cada consulta leva o dono da requisição; sem dono, o banco não devolve nada; o agendador do monitor é o único "sistema"; produção não sobe com superusuário. Testado como ehopent_api, inclusive pela API inteira.
apps/api/src/db/migrations/0006_trava_por_dono.sqlapps/api/src/db/contexto.tsapps/api/src/db/travaPorDono.test.tsdocs/adr/0006-trava-por-dono-no-banco.mdpronto
- S10-1Esquema alinhado ao que a API guarda, em migrações versionadas (ADR 0004)O schema.sql antigo nunca rodou e não batia com as portas: id do Clerk é texto, e metade dos repositórios não tinha tabela.
- S11Planejado
Cobrança
O teste profundo e o monitor só rodam para quem pagou — e o dinheiro entra de verdade.
0%- S11-1Provedor de pagamento ligado (checkout, webhook assinado, Pix e cartão)a fazer
- S11-2Teste profundo e monitor exigem assinatura ou relatório pagoHoje qualquer pessoa logada roda o teste profundo de graça.a fazer
- S12Planejado
Termos e privacidade
O cliente sabe o que autoriza e o que fazemos com os dados dele, antes do primeiro teste.
0%- S12-1Termos de uso e política de privacidade (LGPD) nos 5 idiomas, aceitos no cadastroa fazer
- S13Em andamento
Hospedagem
O site, a API e o banco no ar, no domínio, com o teste profundo isolado.
33%- S13-1Deploy de web, API e Postgres no domínio, com backup do bancoa fazer
- S13-2Worker de varredura sob runsc no host de produçãoDepende do P7.a fazer
- S13-3Etapa 1 no ar: ehopent.com com página de apresentação e lista de espera (sem varredura), português e inglês30/09: Cloudflare (Worker + D1), cabeçalhos de segurança em toda resposta, sem cookies nem estatística, contato@ehopent.com encaminhado. O motor da ehopent roda no próprio site: 0 achados. Aviso de privacidade v1 a revisar pela advogada.
apps/landing/src/index.tsapps/landing/src/lista.test.tsapps/landing/wrangler.jsoncapps/landing/migrations/0001_lista_de_espera.sqlapps/landing/textos.mjspronto
- S14Em andamento
Teste profundo que resolve
O relatório pago entrega o que o documento de negócio promete: correção passo a passo, instrução para a IA do dono e reteste.
60%- S14-1Instrução para a IA do dono em cada achado do relatório pago (confirmado pede correção; sem resposta pede conferência)
apps/web/src/lib/fixPrompt.tsapps/web/src/lib/fixPrompt.test.tsapps/web/src/components/ReportView.tsxpronto - S14-2Passo a passo concreto por tipo de achado, para leigo17 tipos × 5 idiomas no ar (relatório pago, resultado grátis e arquivo para a IA); falta o dono conferir.fazendo
- S14-3Reteste com 1 clique: cada achado aparece como corrigido ou ainda aberto
packages/core/src/retest.tspackages/core/src/retest.test.tsapps/web/src/components/RetestPanel.tsxdocs/relatorio/2026-09-25-s14-reteste.mdpronto - S14-4Cobertura nova do teste profundo (Firebase, chave Google, rotas do próprio app)Escopo a fechar com o dono antes de construir.a fazer
- S14-5Relatório em arquivo para a IA do dono ler inteiro (todos os pontos, o que corrigir e o que conferir)Pedido do dono em 25/09: em vez de copiar e colar ponto a ponto.
apps/web/src/lib/aiBrief.tsapps/web/src/lib/aiBrief.test.tsdocs/relatorio/2026-09-25-s14-arquivo-ia.mdpronto
- S14-1Instrução para a IA do dono em cada achado do relatório pago (confirmado pede correção; sem resposta pede conferência)
- S17Em andamento
Gabarito do motor
Confiança com número, não com palavra: o motor roda contra sites de resposta conhecida e cada alarme falso ou falha perdida aparece.
67%- S17-1Gabarito sintético no CI: alarme falso, falha perdida, gravidade ou certeza errada derrubam o buildNasceu do falso "ALTA" do Firebase no XM Report (25/09).
packages/engine/src/gabarito/gabarito.tspackages/engine/src/gabarito/casos.tspackages/engine/src/gabarito/gabarito.test.tspronto - S17-2Gabarito com apps reais do dono: npm run gabarito:reais compara com a verdade conferida por fora
tools/gabarito-reais.tstools/gabarito-reais.jsonpronto - S17-3Verdade conferida para 10+ apps do dono (hoje: 1 de 11 listados)8 publicados + 3 locais (Cerne, BuskDent, tomox-monai).fazendo
- S17-5Gabarito de apps locais sem abrir exceção na proteção anti-SSRF do produto, com identificação do app antes do testeA identificação nasceu de um erro evitado: a porta 8080 era o Adminer de outro projeto, não o tomox-monai.
tools/gabarito-local.tstools/gabarito-local.jsontools/gabarito-comum.tspronto - S17-6Gabarito de laboratório: 46 casos (teste grátis e profundo), rótulos revisados por especialista externo em 08/10, erros do motor registrados à vistaPlacar em 28/09: 32 de 46 certos; 14 erros conhecidos (8 falhas perdidas, 4 alarmes falsos, 1 gravidade, 1 certeza). Erro novo ou erro que some derruba o build.
packages/engine/src/gabarito/casos-laboratorio.tspackages/engine/src/gabarito/gabarito.tspackages/engine/src/gabarito/gabarito.test.tspronto - S17-4Reclassificar cada tipo de achado com base no que o gabarito mostrarAté 05/10: 10 dos 11 erros corrigidos contra as nossas respostas (46 de 47). 08/10: as respostas certas foram revisadas por especialista externo (Luiz Fernando Dubiela, docs/juridico/2026-10-08-revisao-tecnica-aprovada.pdf) e o motor passou a segui-las: nenhum crítico automático por prefixo; tecnologia identificada é inventário; estado inconclusivo; leitura sem login só é falha se o dado for privado. Gabarito revisado: 48 de 49 (falta o .env.production, que entra no perfil autorizado); código 20 de 20, 1 pendente (C16).fazendo
- S17-1Gabarito sintético no CI: alarme falso, falha perdida, gravidade ou certeza errada derrubam o buildNasceu do falso "ALTA" do Firebase no XM Report (25/09).
- S15Completo
PDF com a marca
Um documento que o dono baixa ou envia a um profissional — gerado pelo servidor, com a identidade da ehopent e o selo verificável.
100%- S15-1PDF gerado no servidor: capa, contagem honesta, três listas, selo com link e QR de verificação
apps/web/src/pdf/ReportDocument.tsxapps/web/src/pdf/buildReportPdf.test.tsapps/web/src/app/api/relatorios/[id]/pdf/route.tsdocs/relatorio/2026-09-28-s15-pdf-real.mdpronto
- S15-1PDF gerado no servidor: capa, contagem honesta, três listas, selo com link e QR de verificação
- S16Planejado
Parcerias de segurança
Recomendar ferramentas de segurança que resolvem o que o relatório encontrou, com comissão por indicação — sem conflito com o diagnóstico.
0%- S16-1Decidir o modelo: quais parceiros, como a indicação aparece, e a regra que separa diagnóstico de vendaIdeia do dono em 25/09.a fazer
- S18Completo
Análise do código do cliente
O relatório pago olha também o código e as bibliotecas do app, não só o site no ar — com acesso só de leitura que o próprio dono concede.
100%- S18-1Motor de análise de código com licença que permite uso comercial em código privado (decisão em ADR)Opengrep (LGPL) com 9 regras nossas, OSV-Scanner (Apache) e Gitleaks (MIT), versão e soma travadas. Gabarito de código: 20 de 21 casos certos.
docs/adr/0005-analise-de-codigo-com-licenca-aberta.mdtools/ferramentas.jsontools/baixar-ferramentas.mjspackages/code-engine/src/executar.tspackages/code-engine/regras/ehopent.yamlpackages/code-engine/src/gabarito-codigo.test.tspronto - S18-2Acesso ao código: o dono conecta o repositório só para leitura (ou envia o código), revogávelTestado de ponta a ponta em 01/10 com o App de teste ehopent-dev (só leitura) no repositório fabioballada/ehopent: conexão, análise e cópia apagada. O App de produção (ehopent, no domínio) vem na etapa 3 do lançamento.
apps/api/src/routes/github.tsapps/api/src/routes/github.test.tsapps/api/src/services/githubApp.tspackages/code-engine/src/repositorio.tsapps/web/src/components/CodePanel.tsxpronto - S18-3Bibliotecas com falha conhecida, pela base pública de vulnerabilidadesDetecção pronta (OSV-Scanner, com a primeira versão que corrige); entra no relatório no S18-5.
packages/code-engine/src/leitura.tspackages/code-engine/src/leitura.test.tspronto - S18-4Segredos no código e no histórico do repositório, sempre mascaradosGitleaks com --redact; o leitor recusa segredo não mascarado e não guarda autor nem e-mail do commit. Entra no relatório no S18-5.
packages/code-engine/src/executar.tspackages/code-engine/src/executar.test.tspronto - S18-5Relatório único: site + código + bibliotecas, com conferência de alarme falso e arquivo para a IA do donoFeito em 5 passos (01 a 05/10): (1) teste e exemplo num bloco à parte; (2) cada ponto com por que importa, como conferir e passo a passo, nos 5 idiomas; (3) botão "Baixar para a sua IA"; (4) análise guardada (só o local de cada ponto) e comparada com a anterior pela regra do reteste; (5) PDF único: o relatório do site leva a análise do código escolhida. Ponto de código é sempre "provável — a conferir".
packages/code-engine/src/local.tsapps/web/src/components/CodePoints.tsxapps/web/src/lib/codeAiBrief.tspackages/code-engine/src/comparar.tsapps/api/src/db/migrations/0005_analises_de_codigo.sqlapps/web/src/pdf/buildReportPdf.tsxpronto
- S18-1Motor de análise de código com licença que permite uso comercial em código privado (decisão em ADR)Opengrep (LGPL) com 9 regras nossas, OSV-Scanner (Apache) e Gitleaks (MIT), versão e soma travadas. Gabarito de código: 20 de 21 casos certos.
- S19Travado
Isolamento entre clientes do app
Responder a pergunta que mais importa num app feito com IA: um cliente do app consegue ver os dados de outro?
0%TravaSó começa com escopo escrito aprovado pela advogada, autorização específica do cliente e validação de especialista externo (decisão do dono, 28/09).
- S19-1Escopo escrito do teste, aprovado pela advogadatravado
- S19-2Teste com contas de teste que o próprio dono cria, validado por especialista externotravado
- S20Travado
Firebase no teste profundo
O Firebase deixa de sair sempre como "não testado": o teste autorizado responde se as regras protegem os dados.
0%TravaAprofunda o teste ativo: só começa com escopo escrito aprovado pela advogada e validação de especialista externo (decisão do dono, 28/09).
- S20-1Teste autorizado das regras do Firestore, Realtime Database e Storage, só leitura, pelo mesmo portão de consentimentoParte do S14-4. Travado em 29/09 pela regra da advogada e do especialista.travado
- S20-2Casos do Firebase no gabarito de laboratório (aberto, fechado, inconclusivo)travado
- S21Planejado
Revisão humana
Um plano acima do relatório automático: especialista de segurança confere o relatório antes de ele chegar ao cliente.
0%TravaDepende de especialista externo contratado (P9).
- S21-1Fila de revisão: o relatório pago espera o especialista, que confirma, descarta ou comenta cada pontoa fazer
- S21-2Relatório e selo dizem "revisado por especialista", com nome e dataa fazer
- S22Travado
Placar público do motor
Mostrar com número o quanto o motor acerta, e a meta — confiança que o concorrente não mostra.
0%TravaDecisão do dono (05/10): não publicar o placar agora — para o leigo, "36 de 47" soa como "paga por algo que falha". O placar segue interno (o CI trava se o motor piorar); a meta é chegar a 45 de 47 ou 47 de 47 (S17-4). Só volta se o dono decidir.
- S22-1Página pública com o placar do gabarito, gerada do próprio gabarito e conferida pelo CITravado em 05/10 por decisão do dono.travado
Esperando o dono
O que engenharia não fecha sozinha. Fica fora da conta dos sprints de propósito: aqui a bola tem dono.
- P1
Clerk: instância de produção, domínio e plano Pro (MFA)
Provedor escolhido (Clerk) e instância de desenvolvimento ligada em 24/09. Falta, para produção: criar a instância de produção no domínio, repetir a customização do token de sessão (aud ehopent-api + email) e assinar o Pro — sem ele não há segundo fator e o teste profundo fica fechado.
- P2trava S6
Assinatura de revisor nativo em EN, ES, DE e FR
As cinco traduções estão completas e travadas por teste de contrato. O que falta é um humano nativo assinar as strings de segurança e consentimento — texto jurídico que soa estranho vira suspeita de golpe, e nenhum teste mede isso.
- P4trava S6
Criar security.ehopent.com e publicar SPF, DKIM e DMARC (none → quarantine → reject)
O contrato e o verificador estão prontos: `npm run email:dns` imprime os registros exatos e mede o que está publicado. Publicar no DNS e subir o DMARC ao longo de 6–8 semanas é do dono do domínio.
- P5trava S6
Iniciar o warmup (EMAIL_WARMUP_STARTED_AT) e o provedor (Postmark/SES)
A rampa e o teto diário estão em código e o portão os aplica. Contratar o provedor, configurar PTR/TLS/webhook de reclamação e deixar as 4 semanas correrem é operação.
- P6
Comprar o certificado VMC/CMC para o BIMI
O SVG está no perfil certo e validado por teste. O certificado exige marca registrada e é compra anual — decisão de custo.
- P7
Instalar o runsc (gVisor) no host e apontar SCAN_WORKER=container
A jaula está em código e testada (flags, protocolo, dois portões). O runtime é instalação no servidor; sem ele o deep scan responde 503 visível, nunca roda fora da jaula em silêncio.
- P8
Contratar pen-test humano externo da plataforma
O automatizado cobre a classe de ataque que o motor procura nos outros e fica verde no CI. Lógica de negócio e criatividade adversarial são de gente — e o laudo externo é o que se mostra a cliente e auditor.
- P3trava S6
Parecer jurídico americano
O portão de país já nega os EUA por padrão, e só um parecer assinado muda isso. É advogado, não é engenharia.
Como ler este painel
O percentual conta apenas tarefa pronta. Em andamento não vira número — pela mesma razão que provável não vira falha confirmada.