Ferramentas estáticas (client-side) de Janilo Saraiva, servidas via Cloudflare Pages em https://apps.pereirasaraiva.com.
Cada pasta é um app independente que roda 100% no navegador, sem servidor:
| App | Caminho | O que é |
|---|---|---|
| RiskJud | /riskjud |
Precificação de risco LGPD (indenização + multa ANPD), calibrada contra dados reais de tribunal brasileiro. |
A raiz (index.html) é a página-hub que lista os apps.
/ página-hub
/riskjud/ RiskJud (index.html + model.mjs + data.json)
Estático, sem build. O Cloudflare Pages serve o repositório direto. Para publicar manualmente:
npx wrangler pages deploy . --project-name=riskjudO modelo do RiskJud (riskjud/model.mjs) é matemática pura e determinística, calibrada contra jurisprudência e exportada a conselho via PDF — então tem rede de teste. Sem build e sem dependências, pelo runner nativo do Node (18+):
node --test riskjud/model.test.mjsCobre: determinismo, teto do Art. 52 (R$ 50M), faturamento = 0 ⇒ multa = 0, monotonicidade (mais maturidade ↓ risco de vazamento; mais usuários ↑ litígio), efeito do investimento na exposição, e a âncora de calibração (taxa_procedencia sai do data.json, não do código).
Cada app novo nasce seguindo estas convenções — são elas que mantêm a fatia limpa (não copie um app existente sem conferi-las):
- Pasta própria (
/meu-app/) comindex.html+model.mjs+data.json+model.test.mjs(+CALIBRACAO.mdse houver dado calibrado). model.mjsé puro: exporta UMA função(params, data) => resultado, sem DOM, rede,DateouMath.random. Toda grandeza que a tela exibe sai pronta do modelo — a view só formata (brl,fmtPct), nunca calcula número de negócio.data.jsoné a calibração: valores medidos, constantes legais e referências de mercado moram no JSON (com_meta: versão, coleta, período), nunca no.mjs. A origem/método de cada número fica numCALIBRACAO.mdao lado; a prosa do HTML injeta os números do JSON (atributosdata-dj), não os digita.model.test.mjscomnode --test(zero deps): determinismo, monotonicidades, tetos e um caso-âncora contra odata.json. O CI rodanode --testna raiz — teste novo entra de graça.- Cores via
var(--brand-*)de../site-chrome.css— nenhum hex no app; gráficos (Plotly etc.) leem os tokens comgetComputedStyle(document.documentElement).
Referência viva das 5 convenções: /riskjud.