Testes db/client.py
10+ testes com DB in-memory para insert, query, export CSV
Testes finops/tracker.py
Record, budget enforcement, circuit breaker, anomaly detection com mocks
Testes finops/monitor.py
Rollup, stale data detection, pricing validation, checkpoint export
Testes finops/secrets.py
mask_key, fingerprint SHA-256, scan_git_for_leaks, key rotation
Testes persistence/timeseries.py
save_aggregate, get_time_series, compute_daily, data_health
Testes collectors/base.py
LLMClient com mocks httpx (respx), token extraction, cost calculation
Retry com backoff exponencial
3 tentativas (2s, 5s, 10s) com jitter. Não retenta 401/403. Log cada retry.
Workflow pytest.yml
Testes automáticos em cada push/PR. Fail-fast. Coverage como artifact.
Workflow ruff lint
Lint automático com ruff. Bloqueia merge se houver violações.
Type checking mypy
Verificação de tipos em src/. Zero erros para merge.
Testes parametrizados por vertical
pytest.mark.parametrize com 4 verticais. Valida coorte, queries e schema por setor.
API REST (FastAPI) com 17 endpoints
17 endpoints em 6 grupos: Health, Verticals, Citations, Collections, Analysis, FinOps. Background tasks para coleta sob demanda. Auth via X-API-Key. CORS habilitado. Swagger em /docs.
Dashboard HTML self-contained
Frontend dark-theme com seletor de verticais, KPIs dinâmicos, barras de citação por LLM, ranking de entidades sortável, série temporal SVG com sparklines.
Sync SQLite para Supabase
Script sync_to_supabase.py sincroniza dados agregados diariamente para Supabase PostgreSQL via REST API. Step automático no GitHub Actions após cada coleta.
Gate de verificação por email
Acesso ao dashboard via código de 6 dígitos enviado por email (Resend API). JWT cookie HttpOnly com validade de 7 dias. Rate limiting integrado.
Dashboard React em /research
Página Next.js com React Server Components + metadata SEO. Seletor de 4 verticais, KPIs dinâmicos, barras de citação por LLM, tabela de ranking sortável, sparkline SVG. Design system Salesforce/Lucida.
Publicação em alexandrecaramaschi.com/research
Dashboard acessível via bypass do gate de email enquanto o domínio Resend é verificado em produção. Deploy automático via Vercel.
geo-finops: tracking unificado de 4 projetos
Pacote standalone que substitui 4 trackers paralelos (orchestrator JSONL, papers SQLite, curso-factory JSON, caramaschi) por SQLite local + sync diário Supabase. Migrou 1.469 calls historicas. Schema único, dedup garantido, retry exponencial. Endpoint live em /api/finops/llm-usage (ISR 1h). 13/13 health checks ponta-a-ponta. Repo: github.com/alexandrebrt14-sys/geo-finops
Bootstrap BCa + Beta-binomial + Fisher fallback
StatisticalAnalyzer ganhou bootstrap_ci_bca (Efron 1987 com correção de viés z0 e aceleração via jackknife), beta_binomial_ci (CI bayesiano conjugado, robusto a N pequeno e k=0/k=n) e fallback automático para Fisher exact no chi² quando min(expected)<5. 25 testes pytest passando.
Cohen's e Fleiss' kappa (inter-rater reliability)
Concordância entre raters/engines corrigida por chance (Landis & Koch 1977). cohen_kappa para 2 raters, fleiss_kappa para N raters. Reportado como inter_llm_fleiss_kappa quando o painel é retangular. Substitui agreement bruto que inflacionava em classes desbalanceadas.
Brier score + reliability diagram
Decomposição de Murphy (1973): BS = reliability - resolution + uncertainty. Reliability diagram com 10 bins. Alimenta diretamente o pipeline de calibração do GEO Score Checker (mede se P(citado) prevista bate com a observada).
Coluna model_version em citations
Migration aditiva para rastreio de non-stationarity dos LLMs ('gpt-4o-mini' em jan ≠ 'gpt-4o-mini' em jun). Permite painel longitudinal válido. Insert padrão usa fallback model_version = model. Index criado.
Bridge Papers ↔ GEO Score Checker
Tabela score_calibration_inputs (D1..D8 + k_cited/n_observations + score_model_version) une features do Score Checker com ground truth empírico de Papers. Schema com CHECK constraints, índices por domain/vertical/collected_at. Foundation da calibração.
scripts/calibrate_score.py — pesos calibrados
Pipeline end-to-end: load → expand para Bernoulli → fit Logit (statsmodels) → AUROC + Brier sob 5-fold CV (Mann-Whitney sem sklearn) → reliability diagram → delta de pesos atual vs calibrado. Modo --simulate N para demo. Em n=200 sintético: AUROC 0.81, Brier 0.037, Spearman 0.95.
GEO Score Checker: inference.ts (TS puro)
Primitivas estatísticas em TypeScript sem dependência: cohenKappa, fleissKappa, bootstrapBcaCI (Efron 1987 com Mulberry32 PRNG seedável), normalCdf/Ppf via Acklam, reliabilityDiagram. 15 testes vitest passando. Habilita rigor matemático no dashboard.
Fleiss kappa no Answer Bubble Divergence
calculateBubbleDivergence agora retorna kappa + interpretation Landis-Koch ao lado de score/severity. Cada campo livre (name/category/proposition) é convertido para shingle canônico (bigramas truncados) antes de virar rótulo nominal. Penaliza concordância trivial em classes desbalanceadas.
computeFinalScoreWithCI — score com IC BCa
Variante de computeFinalScore que aceita B≥5 réplicas estocásticas do vetor de dimensões e devolve {point, ci} via bootstrap BCa. Usuário final passa a ver 'Score = 74 [69, 78]' em vez de 74 cravado. Quando B<5, retorna ci=null.