🎯 Clinicafy — Auditoria cs-*

🧠 cs-karpathy-reviewer — Karpathy-Style Code Reviewer

Auditoria técnica e estratégica pela ótica cs-karpathy-reviewer — Karpathy-Style Code Reviewer. Achados classificados por severidade, plano de ação e matriz de decisão.

!

Veredito: O shim mockFirestore.ts é over-engineering acidental — 409 linhas reimplementando a API do Firestore quando bastaria um wrapper de 30 linhas.

Na linha do 'Don't be a hero' do Karpathy: o mockFirestore.ts recria Timestamp, QuerySnapshot, DocumentReference, CollectionReference — 409 linhas de complexidade acidental. Bastaria uma camada simples de fetch com auth. O alias Vite para 'firebase/firestore' é inteligente, mas o que está atrás é desnecessariamente complexo. O App.tsx tem good parts (Suspense, lazy, motion) mas o onSnapshot simulation (long-polling provável) merece atenção.

409L
mockFirestore.ts (complexidade)
600L
App.tsx (aceitável)
Timestamp/Snapshot
Classes reimplementadas desnecessariamente
uuidv4()
UUID próprio quando crypto.randomUUID existe
lazy+Suspense
Code splitting correto

Dimensões Analisadas

Pontuação por área de análise.

mockFirestore.ts

35

409 linhas reimplementando Timestamp, QuerySnapshot, DocumentReference. Complexidade desnecessária.

3 achados

App.tsx

70

Bem estruturado com lazy+Suspense. SidebarItem com subItems complexo mas justificável.

1 achados

Padrões Gerais

60

TypeScript bem usado. Imports bem organizados. Constantes uppercase no server.ts.

1 achados

🔎 Achados (4)

0 crítico(s) · 1 alto(s) · 0 bloqueante(s). Clique para expandir.

mockFirestore.ts — 409 linhas reimplementando API Firestore desnecessariamenteAltaEsforço altoKarpathy — Simplicity First / No Heroics

O que é: src/lib/mockFirestore.ts:32-409 reimplementa: classe Timestamp (L32-57), mapToSnapshot (L59+), QuerySnapshot, DocumentReference, CollectionReference, WriteBatch. A única função real é traduzir chamadas Firestore para fetch('/api/...). Poderia ser 30 linhas.

Onde: src/lib/mockFirestore.ts:1-409

Impacto: 409 linhas de código a manter. Qualquer mudança de API quebra o shim inteiro. Novos devs precisam entender 2 APIs (Firestore + a falsa).

✅ Correção: Refatorar para wrapper mínimo: function getCollection(name) { return { getDocs: () => authedFetch('/api/'+name).then(r=>r.json()) } }. 30 linhas. Migrar componentes para usar diretamente @/lib/api.ts ao invés de firebase/firestore.
uuidv4() custom quando crypto.randomUUID() já existe no targetBaixaEsforço baixoKarpathy — Use Platform APIs

O que é: mockFirestore.ts:22-30 define uuidv4() com fallback manual para Math.random(). A linha L23-24 já verifica crypto.randomUUID — mas a função inteira é desnecessária se o target environment é sempre moderno (Vite + React 19 = Chrome/Safari modernos).

Onde: src/lib/mockFirestore.ts:22-30

Impacto: Dead code mantido por precaução. Complexidade zero mas sinal de código acumulado sem limpeza.

✅ Correção: Remover a função uuidv4 e usar crypto.randomUUID() diretamente. Se precisar de fallback, lodash.uniqueid.
e2eAuthToken import em mockFirestore — acoplamento de teste com produçãoMédiaEsforço medioKarpathy — Separation of Concerns

O que é: mockFirestore.ts:2: 'import { e2eAuthToken } from ./e2e-auth'. O código de produção importa um artefato de teste. e2e-auth.ts provavelmente exporta um token para testes E2E — mas esse import polui o bundle de produção.

Onde: src/lib/mockFirestore.ts:2

Impacto: Bundle de produção inclui código de teste. Possível vazamento de token de teste se e2eAuthToken não for null em produção.

✅ Correção: Mover e2eAuthToken para environment variable verificada só em NODE_ENV=test. Ou usar import.meta.env.VITE_E2E_TOKEN com default null.
PRODUCT_EVENTS e MARKETING_ATTRIBUTION_KEYS como Set no escopo global do móduloBaixaEsforço baixoKarpathy — Readable Code

O que é: server.ts:78-104 define PRODUCT_EVENTS e MARKETING_ATTRIBUTION_KEYS como const Set no escopo de módulo. São constantes de configuração — deveriam estar em src/lib/config.ts ou similar para serem testáveis e reutilizáveis.

Onde: server.ts:78-104

Impacto: Impossível testar o whitelist de events sem importar server.ts inteiro (com todos os efeitos colaterais).

✅ Correção: Extrair para src/lib/config.ts: export const PRODUCT_EVENTS = new Set([...]) e importar no server.ts.

📋 Plano de Ação

Cronograma de implementação recomendado.

1

Remover e2eAuthToken do bundle prod (1h)

Mover para env var VITE_E2E_TOKEN com guard NODE_ENV=test
seguranca
1h · CRÍTICO
2

Simplificar mockFirestore progressivamente

Migrar uma coleção por sprint para usar @/lib/api.ts diretamente. Meta: substituir tudo em 3 sprints.
refactor
3 semanas
3

Extrair constantes para config.ts

PRODUCT_EVENTS, MARKETING_ATTRIBUTION_KEYS, DUNNING_STAGES → src/lib/config.ts
refactor
2h

Matriz de Decisão

CritérioFonteStatusBloqueante
Simplicidade do shimcs-karpathy-reviewer409L vs 30L necessárionão
e2e token no bundle prodcs-karpathy-reviewerAcoplamento teste/prodnão
Dead code (uuidv4)cs-karpathy-reviewerPlatform API ignoradanão
Lazy + Suspensecs-karpathy-reviewerCode splitting corretonão
TypeScript usagecs-karpathy-reviewerBem tipado em geralnão