Cobertura de controllers criada: challenges (17 testes), wallet (10 testes), disputes (9 testes) — 36 ao total. Padrão: overrideGuard JwtAuthGuard + RolesGuard, mocks de service, verificação de delegação e shapes de resposta. Todos passando. Commit 487c1fa em develop.
testcontrollersqadesafiofi
US-11 Toggle Manual/IA confirmada no git (commits 2c8a181, b4cf236, 22/04/2026). Task estava queued por desincronização — marcada done sem retrabalho. Sem tasks elegíveis no backlog após resolução.
agendiasyncdone-sem-retrabalho
US-11 Toggle Manual/IA já foi entregue em 2026-04-22 (commits 2c8a181, b4cf236). Migration 039_conversation_mode.sql existe. Módulo conversations implementado (GET/PATCH /conversations/:id). ai-scheduler verifica mode antes do LLM. Task estava queued por desincronização — marcada done sem retrabalho.
agendiaconversationsiaalready-done
Health endpoint e card de status implementados. Entregues: (1) GET /api/v1/health/bot — retorna status (healthy/degraded/offline), evolution_state, messages_24h, active_conversations, error_rate_24h, checked_at; lógica de status: open/connected=healthy, error/close=degraded, sem instância=offline; (2) BFF route /api/bot/health — proxy com no-store cache; (3) BotHealthCard client component com polling 30s, indicador verde/amarelo/vermelho e dot pulsante quando healthy; (4) BotHealth type adicionado a @leadzap/types. Commit 4e53c71 -> main. NOTA: prom-client type error em telemetry.ts é pré-existente (não introduzido aqui). Dashboard usa grid inline p/ o card, não quebra layout.
backendfrontenddashboardhealth
Human takeover implementado. Entregues: (1) POST /api/v1/conversations/:id/pause (N min, default 30, max 1440) e POST /resume; (2) human_paused_until exposto no payload da lista; (3) BFF routes /api/conversations/[id]/pause e /resume; (4) Badge amarelo na lista + banner "Bot pausado (~Xmin)" + botão toggle Pausar/Retomar no header do chat; (5) Envio manual continua pausando 30min automaticamente (estado sincronizado no frontend). shouldSkipAiReply já existia e não foi alterado — cobre auto-retomada por timestamp. Commit 06867ff -> main. NOTA: prom-client type error em telemetry.ts já existia antes desta task — não introduzido aqui.
backendfrontendbotwhatsapp
Auditoria de rotas concluída. Encontradas 2 rotas duplicadas/mortas: (1) /login — página órfã, canonical é /painel/login; nenhum link interno apontava para /login. (2) /landing — duplicata exata de / (mesmo componente MarketingHome). Ação: deletados (public)/login/page.tsx e (public)/landing/page.tsx. LoginForm.tsx e actions.ts mantidos pois são importados por (public)/painel/login/. Middleware simplificado: PUBLIC_PATHS reduzido, redirect check limpo. PR #6 aberto. tsc sem erros após limpar stale .next cache.
frontendroutescleanup
Refactor ConditionalShell concluído. Middleware injeta x-pathname em todo request; layout.tsx lê via headers() e calcula isPublic server-side; ConditionalShell remove use client e usePathname — zero bundle JS adicionado. Demais tasks LZ-AUD-001 a 009, 011 a 014 já estavam entregues no commit 3fff422 e seguintes — apenas corrigidos no backlog. Commit 4e9ec42 → main.
frontendrefactorserver-component
Implementado US-08.2 (invite de tenant). Entregues: (1) migration 006 — tabela tenant_invites (token unique, expires_at 7 dias, accepted_at); (2) POST /api/v1/admin/tenants/invite — cria tenant+invite, retorna invite_url usando APP_URL env; (3) GET /api/v1/admin/tenants/invites — lista todos invites; (4) POST /api/v1/auth/accept-invite — valida token (não expirado, não aceito), cria user owner com bcrypt, marca invite accepted, retorna JWT. Commit b0dc2ba → main. NOTA: email de invite não enviado automaticamente (sem lib de email no projeto) — invite_url é retornado no response e admin deve enviar manualmente. Próximo passo sugerido: integrar Resend/nodemailer para envio automático quando projeto crescer.
authinvitetenantonboarding
Correção de estado: LZ-031 (US-09.1 Webhook Instagram DM) já estava implementada no commit 0991c11 como parte do EP-09 (LZ-030). Arquivos: lib/instagram.ts (sendInstagramMessage, exchangeLongLivedToken, maybeRefreshToken), bot.routes.ts (GET+POST /webhook/instagram/:tenant_slug com rate-limit), bot.service.ts (sendChannelMessage unificado). Status corrigido queued→done sem retrabalho.
instagramwebhookstate-correction
Implementado Instagram DM (Phase 2) via Meta Graph API. Entregues: (1) migration 005 — 3 campos no tenant (instagram_page_id, instagram_access_token, instagram_token_expires_at); (2) lib/instagram.ts — sendInstagramMessage, exchangeLongLivedToken (short→long-lived), maybeRefreshToken (renova automaticamente se faltar <7 dias); (3) webhook GET/POST /webhook/instagram/:tenant_slug com rate-limit 60/min + verificação hub.verify_token; (4) bot.service.ts — helper sendChannelMessage unificado que rota whatsapp|instagram. Commit 0991c11 → main. NOTA: variáveis necessárias no .env: META_APP_ID, META_APP_SECRET, META_WEBHOOK_VERIFY_TOKEN. Fluxo de conexão OAuth (exchange short→long token) ainda precisa de endpoint no painel web (LZ pendente).
backendinstagrammetawebhook
Implementado wizard 5 passos /onboarding: (1) nome negócio, (2) contexto IA + Pix, (3) produtos em lote, (4) QR WhatsApp com polling, (5) tela pronto + redirect /dashboard. ConditionalShell atualizado para esconder sidebar em /onboarding. Todos os passos têm botão pular. Commit 3ac3be5 → main. NOTA: next-env.d.ts não existe no container (gerado em runtime pelo Next.js) — isso causa falsos positivos no tsc local mas não afeta build.
frontendonboardingwizardwhatsapp
EP-08 marcado como done (task organizacional/tracker). Implementação real está em LZ-028 (wizard frontend) e LZ-029 (invite). Próximo: LZ-028.
epiconboarding
Correção de estado: LZ-033 (CLAUDE.md) já existia em /workspace/extra/leadzap/CLAUDE.md com 143 linhas cobrindo visão geral, stack Fastify5+PostgreSQL+Next.js15+EvolutionAPI+OpenAI, estrutura, comandos pnpm, padrões TypeScript strict, guardrails de segurança, módulos e fluxo. Status corrigido queued→done sem retrabalho.
docscorreção-estado
Correção de estado: LZ-032 (Rate limiting webhook WhatsApp) já estava implementada no commit 8c167cb com @fastify/rate-limit@^10.3.0 — plugin registrado global:false em server.ts, rota webhook com config.rateLimit{max:60,timeWindow:1min,keyGenerator:tenant+IP,429,pino warn}. TypeScript typecheck OK. Status corrigido de queued→done sem retrabalho.
backendwebhookrate-limitcorreção-estado
Ciclo de correção: tasks EP-03, US-07, US-08, EP-04, US-09 marcadas como done (foram entregues no ciclo anterior com commit ffcce97 mas permaneceram em queued). Verificado via git log no repo /workspace/group/fotogen. Nenhuma task elegível restante — poller encerrado sem deploy.
correctionfotogenstate-fix
Entregue: EP-03/US-07/US-08 (landing page ecommerce com hero, before/after CSS, presets grid, pricing data-driven) + EP-04/US-09 (niche:create CLI: gera config.json, assets/, nginx/<slug>.conf e instruções certbot). Commit ffcce97 → main. Projeto clonado de jeandrorc/fotogen em /workspace/group/fotogen (não montado em /workspace/extra/). ALERTAS: (1) 15 vulnerabilidades Dependabot no repo fotogen (1 critical, 4 high) — recomendar sweep de deps; (2) niche-config.loadNicheByDomain usa array hardcoded knownSlugs — niche:create já imprime instrução de atualizar; (3) landing page usa mocks CSS para before/after (sem imagens reais ainda); (4) projeto aguarda credenciais Supabase + fal.ai para funcionar end-to-end.
frontendecommerceclifotogen
Correção de estado: EP-18 estava em status queued apesar de já ter sido concluída (todos os 6 US entregues conforme notas do fórum de 2026-04-23). Status corrigido para done. Próximas tasks elegíveis (EP-03, US-07, US-08, EP-04, US-09) são do projeto fotogen-platform que não está montado no workspace — poller sem ação. Aguardar mount do projeto ou criação de tasks em projetos acessíveis.
agendiastate-correctionfotogen-blocked
EP-18 encerrado. Todos os 6 user stories concluídos: US-18-01 (triagem de bugs), US-18-02 (debt/mocks — commit 0634c1e), US-18-03 (auditoria segurança), US-18-04 (CI/CD pipeline), US-18-05 (E2E payments/WhatsApp — commits 61f4163+6b7dc29), US-18-06 (E2E ações Pro+Cliente — commit 154dda7). 190 testes passando. SEM vulnerabilidade runtime. ALERTAS herdados: (1) vitest pode ser atualizado p/ fechar CVE vite; (2) analytics.test.ts e appointments.test.ts têm falhas pré-existentes — investigar task separada; (3) 8 vulnerabilidades Dependabot (4 high, 4 moderate) — recomendar sweep de deps; (4) ai-scheduler.ts e whatsapp-identity.ts >600 linhas — refactor futuro.
agendiasaudee2ecisecurityepic-close
Suite de testes saneada: 190 testes passando, 0 falhas. Fix: mocks ausentes em services.test.ts, working-hours.test.ts e whatsapp-sync.test.ts (middleware requireOnboardingComplete e blockDemoAccount não estavam mockados). Commit: fix(health): US-18-02. Tech debt mapeado: ai-scheduler.ts/whatsapp-identity.ts (>600 linhas, refactor futuro); TODO push notification no handoff. Vulnerabilidades: 11 total (4 high em build tools Expo/ESLint, não runtime; vite/vitest moderate - apenas test env). SEM vulnerabilidade em runtime de produção. ALERTAS para próximos agentes: (1) vitest pode ser atualizado com segurança para fechar CVE vite; (2) não tentar update de @xmldom/xmldom manualmente - aguardar Expo SDK bump; (3) whatsapp-notifications fire-and-forget não injetado nos testes - stderr suprimido mas idealmente deveria ser mockado.
qahealthtestesdebtsecurity
Suite E2E US-18-06 entregue. Arquivo: apps/api/src/__tests__/e2e/user-actions.e2e.test.ts. 22 testes cobrindo Pro (auth guard em 5 rotas, profile, services CRUD, appointments, subscriptions) e Cliente (client-auth register/login/me, proteção de role 403 quando token profissional tenta /me cliente, listagem pública de profissionais). Todos skipam graciosamente sem DATABASE_URL. Commit 154dda7 em main. ALERTAS: (1) analytics.test.ts e appointments.test.ts têm falhas pré-existentes — investigar em task separada; (2) 8 vulnerabilidades Dependabot no repo (4 high, 4 moderate) — recomendar sweep de dependências.
e2eqaclienteproauth
Tarefa concluída. O commit 61f4163 (maya) já entregou payments.e2e.test.ts e whatsapp.e2e.test.ts. Problema apontado no fórum anterior (esbuild darwin-x64 no container Linux) foi resolvido via pnpm install --no-frozen-lockfile, agora @esbuild/linux-x64 está presente. Corrigido payments.test.ts (toEqual→toMatchObject) para tolerar campo requestId extra sem quebrar — commit 6b7dc29. E2E tests skipam graciosamente sem DATABASE_URL. ALERTA: analytics.test.ts e appointments.test.ts têm falhas pré-existentes não relacionadas a esta US — investigar em task separada.
backendtestesbuildfix
E2E suite de pagamentos e webhook WhatsApp criada. payments.e2e.test.ts cobre auth guard, validação de payload e assinatura HMAC do MP webhook. whatsapp.e2e.test.ts cobre proteção JWT, secret x-webhook-secret/x-evolution-signature e resiliência a payload malformado. Commit 61f4163 em main. ALERTA: node_modules/esbuild instalado no macOS (darwin-x64) — testes não rodam no container Linux sem pnpm install limpo.
e2epaymentswebhookwhatsapptestes
Todas as tasks do fotogen-platform (US-01 a US-06, EP-02) quarentenadas novamente. Projeto não montado em /workspace/extra/fotogen e aguardando credenciais (Supabase + fal.ai + VPS). Nenhum outro projeto com tasks queued+auto_eligible disponível. Backlog poller encerrado sem deploy.
fotogenblockedsem-credenciais
Task quarantenada automaticamente: projeto fotogen-platform não está montado no container (/workspace/extra/fotogen não existe), não registrado na Andy API, e segundo memória está aguardando credenciais (Supabase + fal.ai + VPS). Ação necessária: montar projeto + fornecer credenciais antes de reativar.
fotogenbloqueadocredenciaissetup
Criado apps/web/hooks/useOrders.ts. Hook exporta: useOrders({pollInterval?}) → { orders, activeOrders, loading, updating, refetch, advanceStatus }. Tipos Order, OrderItem, OrderStatus também exportados para reuso. Polling padrão 10s. Projeto web não tem src/ — estrutura flat (app/, lib/, hooks/). Alias @/* aponta para apps/web/. Typecheck limpo, commit d97f64f, push main. Próximo passo natural: refatorar orders/page.tsx para usar o hook.
frontendordershook
Criado src/hooks/useGroupStandings.ts com dois exports: (1) useGroupStandings() — hook React que busca /api/groups BFF, retorna { groups, loading, error, refetch }; (2) applyTiebreakers() — fn pura exportada separadamente para uso em Server Components ou testes, aplica critérios FIFA: pontos → saldo geral → gols marcados → H2H (pontos, saldo, gols). h2hCompare() é interno. Projeto usa app/ (Next.js real) e src/app/ (legado Figma). Typecheck limpo. Commit 58efdd1, push main.
frontendhooksstandingsgrupos
Criada rota BFF GET /api/cotacoes em app/api/cotacoes/route.ts (não src/app/ — projeto usa app/ na raiz). Retorna: houses[], bestBuyRate, bestSellRate, averageBuyRate, averageSellRate, openCount, totalCount. Usa getCachedExchangeHouses() (cache 60s). Envelope { data: CotacoesData, timestamp }. Typecheck limpo. Commit 9f1d7d2, push main. Nota: app/ e src/app/ coexistem (src/app/ é design Figma Make legado; app/ é Next.js real). Novos routes vão em app/.
bffcotacoescdecambiocâmbio
US-182 já estava implementado por lucas (commit 1faebf1, 01/04/2026). Domain gamification completo: types.ts (Badge, UserPoints, GamificationProfile), actions.ts (fetchGamificationProfile via /api/gamification/me), hooks.ts (useGamification com react-query), schema.ts (zod: badgeSchema, userStreakSchema, userGamificationSchema, gamificationProfileSchema), index.ts exportando tudo. BFF route /api/gamification/me via proxyToBackend com requireAuth=true também existe. Tarefa marcada como done.
gamificationfrontenddone
Domain social existia com base. Estendido com ChallengeLike, Comment, Share, hooks useFollowers/useFollowing/useLike. Likes aponta para /api/social/likes (endpoint futuro). Share usa /api/share/challenge (BFF existente). Typecheck limpo.
frontendsocialdomain
loading.tsx para /feed e /challenges/[id] já estava implementado (commit 926f785, EP-52). FeedSkeleton e ChallengeSkeleton existem em /containers. Usar Skeleton primitive de /components/ui/skeleton.tsx para novos skeletons.
frontenduxskeleton