6.4 KiB
6.4 KiB
Auditoria de prontidão do piloto
Estado encontrado antes do hardening desta entrega. O resultado depois das mudanças está em 18-pilot-final-gate.md.
Nenhum repositório real da Elo Pro estava disponível. Os nomes profiles, workspaces e workspace_members são o contrato local, não um schema confirmado.
| Item | Classificação | Estado | Evidência | Risco | Dependência externa | Decisão | Módulo | Ação | Severidade |
|---|---|---|---|---|---|---|---|---|---|
| 1. Autenticação Supabase | NEEDS INTEGRATION | getUser quando URL e anon key existem. Sem tabela de senha. |
src/server/auth/context.ts |
Piloto sem o projeto Supabase da Elo Pro não autentica de verdade | Projeto Supabase Elo Pro | Não criar identidade paralela | src/server/auth |
Ligar as envs e validar login real | Alta |
| 2. Workspace | READY WITH CONFIGURATION | Cookie elo_pro_workspace_id validado por membership no servidor |
context.ts |
Cookie de outro ambiente aponta workspace errado | Cookie emitido pela Elo Pro | Confirmar o nome do cookie no host real | context.ts |
Testar troca de workspace no host | Alta |
| 3. RLS | READY WITH CONFIGURATION | Policies e FORCE RLS no shim. Testes usam PGlite com app_user |
migrations/0003_rls.sql, tests/integration/rls.test.ts |
Postgres real pode divergir do PGlite | Postgres Elo Pro | Não aplicar o shim se as tabelas já existirem com outro formato | migrations/ |
Rodar o teste de isolamento no banco do piloto | Alta |
| 4. Papéis | READY | owner, admin, gestor, agent. Superadmin local não ignora o módulo | permissions.ts |
Papéis reais da Elo Pro podem ter outros nomes | Membership real | Mapear papéis quando o schema for confirmado | permissions.ts |
Manter o adaptador | Média |
| 5. Feature flag | READY WITH CONFIGURATION | spreadsheet_adapter nasce desligada |
workspace_module_flags, scripts/set-flag.ts |
Ligar para todos os workspaces | Operação | Só o workspace piloto | flag | Ativar no passo final do runbook | Alta |
| 6. Storage | NEEDS INTEGRATION | Interface privada. Produção exige bucket. Download passa pela rota autenticada | src/infra/storage |
Bucket público ou URL permanente | Bucket Supabase | Manter privado | storage/supabase.ts |
Criar bucket privado | Alta |
| 7. Jobs | READY WITH CONFIGURATION | Estados duráveis no Postgres. Inline só fora de produção | service.ts, process-job.ts |
Piloto subir em inline | Worker | ADAPTER_JOB_MODE=worker |
scripts/worker.ts |
Subir o worker | Alta |
| 8. Redis | NEEDS INTEGRATION | Lock e fila de IDs. Sem Redis a produção recusa o processamento | src/infra/redis |
Várias instâncias sem Redis processam em duplicidade | Redis | Obrigatório no piloto | redis.ts |
Preencher REDIS_URL |
Alta |
| 9. Locks | READY | Lock por usuário, TTL 120s, liberação no finally |
lockKey |
Lock em memória não atravessa processos | Redis no piloto | Não usar lock global | redis.ts |
Usar Redis | Média |
| 10. TTL | READY WITH CONFIGURATION | Obrigatório em produção. Dev usa 3600 | src/config/retention.ts, ADR 0004 |
Temporários eternos se a env faltar | Número operacional | Não gravar o número no código | retention.ts |
Definir a env no piloto | Alta |
| 11. Limpeza | READY | cleanupExpired ignora /models/ e é idempotente |
process-job.ts |
Falha de storage deixa blob órfão | Storage | Falha de limpeza não pode derrubar o job | worker | Observar CLEANUP_FAILED |
Média |
| 12. Auditoria | READY | Eventos sem células. Append-only para app_user |
scrub.ts, 0004_audit_append_only.sql |
Service role ainda escreve | Nenhuma | Não apagar auditoria no rollback | audit_log |
Manter | Média |
| 13. Sentry | READY WITH CONFIGURATION | Sem DSN fica inerte. Payload descarta texto livre | scrub.ts, capture.ts |
DSN ausente deixa o piloto cego | Projeto Sentry | Não anexar arquivo | instrumentation.ts |
Configurar DSN | Média |
| 14. XLSX | NEEDS DECISION | ExcelJS 4.4.0 gera workbook novo. O modelo original não é reescrito | parse.ts, ADR 0005 |
Formatação do modelo não é preservada | Nenhuma para o MVP | Manter ExcelJS no piloto | 13-xlsx-library-review.md |
Aceitar a recomendação | Média |
| 15. CSV | READY | UTF-8, delimitador, neutralização na saída | csv.ts, csv-injection.ts |
Encoding legado é recusado | Nenhuma | UTF-8 apenas | parse.ts |
Manter | Baixa |
| 16. PDF | READY | Gerado sob demanda, truncado em 200 linhas e 12 colunas | pdf.tsx |
Usuário espera o arquivo inteiro | Nenhuma | Truncamento já documentado | pdf.tsx |
Informar o limite | Baixa |
| 17. Exclusão | NEEDS DECISION | Soft delete de modelo. Blob temporário sai com o TTL | ADR 0006 | Reter planilha além do necessário | Negócio | Política provisória configurável | retention-policy.ts |
Não fazer hard delete de auditoria | Média |
| 18. Migrations | READY WITH CONFIGURATION | 0001 é shim. 0002–0004 são do Adaptador | migrations/ |
Aplicar 0001 em cima do schema real da Elo Pro | Schema real | 0001 só se as tabelas não existirem | identity-port.ts |
Conferir o banco antes do migrate | Alta |
| 19. Variáveis | NEEDS INTEGRATION | .env.example lista o conjunto. A validação recusa produção incompleta |
src/config/env.ts |
Build de CI não tem os segredos e não deve falhar | Secrets do piloto | Falhar no start, não no build | 15-production-environment.md |
Preencher no ambiente | Alta |
| 20. Dev versus produção | READY WITH CONFIGURATION | ADAPTER_DEV_AUTH exige não-produção |
dev-session.ts |
Segredo de dev vazado para produção | Nenhuma | Produção recusa a flag | env.ts |
Não definir o segredo no piloto | Alta |
Pilot Go-Live Blockers
Estes itens impedem ativar o primeiro workspace piloto. O restante é preparação já coberta no código ou decisão que não bloqueia se a recomendação for aceita.
- O banco e o Auth reais da Elo Pro não estão ligados. O shim de identidade não pode ser aplicado se as tabelas já existirem com outro formato.
- O bucket privado de storage não está criado nem configurado.
- Redis e o worker não estão em execução no ambiente do piloto. Inline fica recusado em produção.
SPREADSHEET_TEMP_TTL_SECONDSainda não tem valor no ambiente de piloto.- O smoke com Supabase, Redis e bucket reais não foi executado.
- A feature flag do workspace piloto continua desligada, de propósito, até o fim do runbook.