SwipeAD — relatório final validado
Auditoria consolidada das demandas do WhatsApp, correções desta rodada, banco da VPS, testes automatizados, navegador real, bundles e deploy Cloudflare.
1. Resposta objetiva às novas perguntas
- A estrela da Dashboard salva o anúncio individual. Ela é um favorito pessoal e separado.
- O botão “Salvar biblioteca” salva a página inteira do anunciante. Ele aparece uma única vez no cabeçalho de uma rota
view_all_page_id, registra a biblioteca monitorada e inclui todos os anúncios daquela página nas atualizações. - O botão não foi perdido. Teste real: página com 23 anúncios, 23 botões de WhatsApp e exatamente 1 botão “Salvar biblioteca”. O estado mudou de salvo para não salvo e voltou ao estado original via servidor.
- A página interna de planos foi removida.
/planosretorna HTTP 308 para/#planos; o usuário vencido e os links da extensão apontam para a landing pública.
2. Falha Lastlink / banco da VPS
Corrigida. A causa de upsertUserPlan failed: VPS DB error 500: Query failed era o schema atrasado no SQLite da VPS. O Worker já enviava os campos Lastlink, mas as colunas ainda não existiam.
| Proteção | Backup completo em /opt/swipead-vps-api/swipead.db.before-lastlink-20260902-0610. |
|---|---|
| Migrações | Aplicadas 0012 a 0019: identidade pública, bibliotecas privadas e campos/configuração Lastlink. |
| Integridade | PRAGMA integrity_check = ok. |
| Plano | Exatamente um plano público pago ligado ao produto Lastlink informado. |
| Teste equivalente | Upsert com lastlink_subscription_id retornou upsert_changes=1 dentro de transação revertida, sem alterar cliente real. |
| Confirmação funcional | O endpoint de salvar biblioteca, que também falhava por schema atrasado, passou no navegador real após a migração. |
| Compra afetada | Ativada com sucesso às 10:18 UTC: plano ativo, vencimento em 02/10/2026 e assinatura Lastlink vinculada. |
| Fila administrativa | Os dois eventos antigos que já tinham auditoria de processamento bem-sucedido foram reconciliados como processados; nenhum evento Lastlink aprovado permanece falsamente pendente. |
3. Regressão da extensão e WhatsApp
A regressão principal surgiu quando dois módulos dinâmicos passaram a ser carregados sem constarem em web_accessible_resources. O Chromium bloqueava download-names.js e facebook-permalink.js, abortando a inicialização. Isso foi corrigido na versão 0.9.17.
Também foi restaurado o contrato comprovado no histórico: pesquisar no Google o identificador público de page_profile_uri e montar o permalink com o page_id interno da Ads Library. A corrida de carregamento das abas ocultas foi corrigida.
| Teste real | Resultado |
|---|---|
| Carregamento | Service worker 0.9.17 carregado; 23 cards reconhecidos, 23 botões; zero erro de console. |
| 3 anúncios de Renato Cariani | Fluxo executado três vezes: not_found nos três, sem travamento e sem falso positivo. |
| 2 anúncios do caso histórico Recheio Fácil | A busca pública encontrou candidatos e montou permalinks com o ID interno correto. O perfil de QA não está autenticado no Facebook e foi redirecionado ao login. |
Estado honesto: o defeito de inicialização e o algoritmo de IDs foram corrigidos e validados. A revelação final depende de sessão Facebook autenticada; essa sessão não existe no perfil de teste da VPS.
4. Demandas anteriores da conversa
| Demanda | Status | Evidência |
|---|---|---|
| Pagamento apenas Lastlink e um plano pago | PASS | Um plano público pago; webhook e checkout Lastlink; valores antigos limpos. |
| Favorito individual separado de bibliotecas “Salvas” | PASS | Tabelas e fluxos separados; modelo de 10 bibliotecas, sem pastas. |
| Remover pastas | PASS | UI/API removidas e associações antigas zeradas sem apagar favoritos. |
| Limite de 10 bibliotecas | PASS | Bloqueio compartilhado no backend e contador na extensão. |
| Múltiplos banners administráveis | PASS | Admin adiciona/remove/ativa; dashboard mostra ativos. |
| Macro-nichos, idiomas e bandeiras | PASS | Normalização e agrupamento presentes no dashboard. |
| Contagem de anúncios mais visível | PASS | Pílulas visuais injetadas sem duplicação após scroll. |
| Relatório diário WhatsApp (item 13) | PASS GUI + backend | Login admin real, botão “Gerar relatório” clicado em produção, textarea e botão “Copiar” exibidos, texto final válido e zero erro de console. |
| Transcrição gratuita dos áudios | PASS | Whisper local/quantizado, sem API paga, cruzado com texto e imagens do ZIP. |
5. Evidências visuais
Capturas reais. As primeiras isolam a regressão e a correção; as demais confirmam a produção atual e o destino de planos.






https://swipead.pro/#planos.

6. Produção e artefatos
| Worker | 008d8aa0-d85c-4559-8346-397913e36fbc, rotas, cron e fila ativos. |
|---|---|
| Bundles JavaScript | 70/70 arquivos retornaram e foram idênticos byte a byte ao build. |
| ZIP | SHA-256 local/produção: aa70c405a08d23b4b9c8184ba138b09ee793bbb53e927cb473a370504fccd5ea. |
| Versão pública | /api/extension/version retorna 0.9.17. |
| /planos | HTTP 308 para https://swipead.pro/#planos; Playwright encontrou a seção. |
7. Projetos Wrangler encontrados
| Projeto | Domínio | Ação |
|---|---|---|
swipead Worker | swipead.pro | Atualizado. |
swipead Pages | swipead.pages.dev | Identificado; produto servido pelo Worker. |
swipead-test-reports | swipead-test-reports.pages.dev | Este relatório. |
swipead-evidencias | swipead-evidencias.pages.dev | Espelho deste relatório. |
Os demais projetos da conta não pertencem a esta demanda e não foram alterados.
8. Git
Commit criado localmente: 018b9a7. O push não foi aceito porque o token HTTPS fornecido está inválido e a chave SSH instalada é somente leitura. O deploy Cloudflare foi concluído diretamente a partir desse commit; falta uma credencial GitHub com escrita para sincronizar origin/main.