🔗 Caso 1 — Expiração de links curtos
Comando:
/claudex plan adicionar expiração para links curtos
📝 PLAN.md INICIAL (rascunho fraco)
# PLAN.md ## Objetivo Adicionar expiração para links curtos. ## Abordagem - Adicionar coluna expires_at na tabela links - Endpoint GET /links/:id retorna 404 se expirado - Job diário marca expirados ## Etapas 1. Migration (1h) 2. Atualizar handler (2h) 3. Job de limpeza (1h) 4. Testes (2h) ## Riscos - Nenhum identificado.
🔬 Findings reais (3 rodadas)
# findings-round-1.md (Engenheiro Sênior) ALTO: - Plano não trata links já criados (backfill obrigatório) - 404 vs 410: status diferente para "expirado" vs "não existe" MÉDIO: - Cache de CDN com TTL de 24h ignorado - Estimativa "Job (1h)" otimista; com batch+lock = 4h # findings-round-2.md (Segurança) ALTO: - Race: dois requests simultâneos podem ler link "quase expirado" - Sem auth no endpoint de admin que renova expiração MÉDIO: - Audit log ausente para mudanças de expires_at - Validação de timestamp futuro mas dentro de limite razoável # findings-round-3.md (Ops/SRE) ALTO: - Sem rollback descrito para a migration MÉDIO: - Sem métrica de "links expirados servidos por engano" - Job sem lock (pode rodar 2x em deploys com 2 réplicas) - Logs sem nível estruturado BAIXO: - Documentação interna não atualizada
✨ PLAN.md FINAL (endurecido)
# PLAN.md (versão final, após 3 rodadas) ## Objetivo Adicionar expiração para links curtos com: - distinção semântica entre "expirado" (410) e "não existe" (404) - compatibilidade com cache de CDN - rollback seguro - observabilidade completa ## Decisões Técnicas - Links existentes recebem expires_at = NULL (permanentes por backfill) - Status HTTP: 410 Gone para expirados, 404 para inexistentes - TTL da CDN reduzido para 5min na rota /r/:id - Lock distribuído no job (Redis SET NX) para evitar duplicação - Audit log em tabela separada para auditoria de compliance ## Etapas 1. **Migration up** (1h) - Adicionar expires_at TIMESTAMP NULL - Adicionar expired_at TIMESTAMP NULL (auditoria) - Index parcial em expires_at para query do job 2. **Migration down testada em staging** (30min) - Script de rollback que preserva dados (não DROP COLUMN) 3. **Endpoint GET /r/:id atualizado** (2h) - Lógica: SELECT, se NULL → ok; se <NOW() → 410; senão → ok - Retorna headers Cache-Control: max-age=300 4. **Endpoint admin POST /links/:id/renew** (2h) - Auth obrigatória (admin role) - Audit log inserido em cada chamada 5. **Job de limpeza com batch+lock** (4h) - Batch size 1000, lock Redis (TTL 10min) - Marca expired_at em vez de deletar 6. **Métricas e logs** (2h) - app.links.expired_served (counter) - app.links.expiration_check_duration (histogram) - Logs JSON com level, link_id, action 7. **Testes integração** (3h) - Inclui backfill, race conditions, rollback ## Riscos e Mitigações - **Cache CDN servindo expirados** → TTL reduzido para 5min - **Race em verificação** → check feito no banco no momento da request - **Job concorrente** → Redis lock distribuído - **Migration sem rollback** → script down testado em staging ## Rollback 1. Reverter deploy do app (versão N-1) 2. Migration down: dropar índice, NÃO dropar coluna (preserva dados) 3. CDN TTL pode permanecer em 5min sem efeito adverso ## Observabilidade - Dashboard Datadog: links.expired_served, links.404, links.410 - Alerta: expired_served > 100/min (indica cache stale) - Logs estruturados em JSON pra Datadog ## Critério de Aceite - 99% das requests após expires_at retornam 410 em < 100ms - Zero erros 500 nas próximas 24h pós-deploy - Audit log preenchido em 100% das renovações - Rollback executado com sucesso em staging ## Estimativa total ~14.5h (vs 6h da versão inicial — diferença é o que evita 2 semanas de retrabalho)
📊 ROI deste caso
Custo do ciclo: ~$0.80, ~10 min. Tempo extra na implementação por causa do plano endurecido: ~8h. Mas evitou: ~2 semanas de retrabalho descobrindo cada problema em produção. ROI: ~10×.
📊 Caso 2 — Tracking de sessões
Comando:
/claudex plan criar página de tracking de comportamento de usuários com cliques, tempo, sessões e eventos
📝 PLAN.md INICIAL
# PLAN.md ## Objetivo Tracking de comportamento de usuários. ## Etapas 1. Criar página 2. Adicionar tracking JS 3. Salvar eventos no banco 4. Dashboard simples
🔬 Achados principais (resumidos)
R1 (Engenheiro): onde armazenar? PostgreSQL não escala para milhões de eventos. Considerar ClickHouse/BigQuery. R2 (Segurança): consentimento (LGPD/GDPR)? Usuários anônimos têm rastreamento? Cookie? localStorage? R3 (Ops/SRE): backpressure se 1M de eventos chegarem? Fila? Como reprocessar dados perdidos?
✨ PLAN.md FINAL
# PLAN.md (final)
## Objetivo
Sistema de tracking de comportamento com:
- Conformidade LGPD/GDPR (banner de consentimento)
- Capacidade para 100k eventos/min
- Reprocessamento de eventos perdidos
- Distinção entre usuários anônimos e identificados
## Decisões Técnicas
- Cliente: SDK JS injeta script após consentimento
- Identificação: cookie httpOnly + UUID anônimo (rotacionado)
- Coleta: endpoint POST /track aceita batch (max 100 eventos)
- Fila: Kafka topic events.raw com 12 partições
- Storage: ClickHouse para eventos (analytics), Postgres para metadata
- Dashboard: Metabase consultando ClickHouse
## Etapas
1. **Banner de consentimento** (1 sprint)
- Modal LGPD com opt-in/opt-out
- Cookie de preferência (httpOnly, secure, samesite=strict)
2. **SDK JS** (1 sprint)
- Coleta cliques, scroll depth, tempo na página
- Buffer local (sendBeacon ou fetch keepalive)
- Não coleta se não houver consentimento
3. **API de ingestão** (1 sprint)
- POST /track com validação Zod
- Push para Kafka com retry exponencial
- Rate limiting por IP (1k req/min)
4. **Consumer Kafka → ClickHouse** (1 sprint)
- Worker em Go (alto throughput)
- Reprocessamento via consumer group dedicado
5. **Dashboard Metabase** (3 dias)
- Métricas: eventos/min, top cliques, funil
6. **Compliance** (paralelo)
- DPO valida fluxo
- Retenção: 90 dias para anônimos, 1 ano para identificados
- DSR endpoint para deleção
## Riscos
- **Pico de tráfego (100k+ events/min)** → Kafka absorve, autoscaling no consumer
- **Vazamento de PII** → Sanitização no SDK (não captura inputs)
- **Cookie bloqueado** → Funciona com localStorage como fallback (sem cross-device)
## Rollback
- Feature flag: TRACKING_ENABLED. Off → SDK não carrega.
- Kafka retém 7 dias (rebobinável)
## Observabilidade
- Throughput Kafka, lag do consumer, CH insert latency
- Métricas LGPD: % consent, % opt-out, % DSR cumpridos
## Critério de Aceite
- Picos de 100k events/min processados sem perda
- 100% dos usuários no UE veem banner antes do tracking
- DSR (deleção) atendido em < 30 dias
- Dashboard atualizado em < 1 min de delay🔐 Caso 3 — Migração de auth para Clerk
Comando:
/claudex plan -5 migrar autenticação atual (custom) para Clerk, mantendo sessões existentes
📝 PLAN.md INICIAL
# PLAN.md ## Objetivo Migrar auth para Clerk. ## Etapas 1. Criar conta no Clerk 2. Trocar middleware de auth 3. Migrar usuários 4. Remover código antigo
🔬 Achados principais (5 rodadas)
R1 (Engenheiro): senhas em hash bcrypt vs Clerk requer exportação especial (não há "import bcrypt direto"). R2 (Segurança): sessions ativas durante migração? Login que estava válido à noite e quebra de manhã = downtime de UX. R3 (Ops/SRE): rollback parcial: o que se 30% migraram e resto não? Estado misto perigoso. R4 (Engenheiro 2): refresh tokens, scope claims, custom claims do JWT atual têm equivalente no Clerk? R5 (Segurança 2): MFA: usuários com TOTP ativo perdem o device durante migração?
✨ PLAN.md FINAL (resumo das 7 seções)
# PLAN.md (versão final, 5 rodadas) ## Estratégia: Dual-stack com migração gradual Não há "big bang". Sistema roda Clerk + auth antiga em paralelo por 4 semanas. Cada usuário migra na próxima sessão. ## Decisões Técnicas - Clerk recebe usuários novos imediatamente - Middleware tenta Clerk primeiro, fallback pra auth antiga - Senhas bcrypt: usuário re-autentica no próximo login (Clerk re-hasha em bcrypt-clerk) - MFA TOTP: prompt pra re-cadastrar device antes da migração - Custom claims migrados via metadata do Clerk ## Etapas (4 semanas) - Semana 1: Setup Clerk + middleware dual - Semana 2: Novos usuários no Clerk; migração de devs como teste - Semana 3: Banner de "re-login para migrar" + email outbound - Semana 4: 95%+ migrados; corte oficial; auth antiga read-only - Semana 5: Remoção do código antigo ## Riscos e Mitigações (resumo de 18 itens) - **Sessão quebra ao migrar** → grace period de 24h aceita ambos - **MFA perdido** → email com QR code pra re-cadastro - **Sessions servidor-side** → migra em background com worker - **Webhook do Clerk falha** → fila de retry com 3 tentativas - **Compliance auditor** → log estruturado de cada migração ## Rollback Se <50% migraram em 2 semanas: 1. Desabilitar Clerk no middleware (flag) 2. Auth antiga reativada 3. Usuários migrados ainda funcionam (Clerk é addon) Se >90% migraram: 4. Não há rollback; só forward fix. ## Observabilidade - % usuários migrados (gauge) - Latência do middleware (histogram) - Erros de auth por origem (clerk vs antiga) - Re-cadastros de MFA bem-sucedidos / falhos ## Critério de Aceite - 0 incidentes de "fui deslogado sem motivo" - 95% migrados em 4 semanas - 100% das migrações com audit log - MFA preservado para 100% dos usuários que tinham - Custom claims funcionam idênticos pré/pós-migração
📊 ROI deste caso
Custo do ciclo: ~$1.50, ~18 min. Migração de auth sem downtime documentada. Versão inicial teria causado deslogue em massa, downtime de horas, perda de MFAs, ticket avalanche. ROI deste caso é difícil de medir mas seguramente é >100×.
🎉 Você terminou a Trilha 3!
Agora você sabe instalar, usar todos os comandos, calibrar rodadas, passar arquivos de escopo e tem 3 exemplos completos pra usar como template.
🚀 Próxima trilha:
Trilha 4 — Recursos Avançados: customização de personas, debugging, métricas, ROI e quando o Claudex não basta.