Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions AUDITORIA-ARQUITETURA.md
Original file line number Diff line number Diff line change
Expand Up @@ -269,12 +269,12 @@ Ponto de atenção (não derruba a nota, mas é a única rachadura na interface)

## Checklist de verificação

- [ ] `node --test` existe e roda verde em `riskjud/model.test.mjs` (A1).
- [ ] Os testes cobrem: monotonicidade (cenário/base/faturamento/reincidência), `P_SUE_CAP`, teto Art. 52 (R$ 50M e 2%), `min 0.90`/`min 0.95`, `faturamento=0 ⇒ anpd=0`, `regimeDano`, e 1 caso-âncora vs. `data.json` (A1).
- [ ] Um erro deliberado de sinal no litígio faz **pelo menos um** teste falhar (A1).
- [ ] `riskjud/index.html` não contém nenhuma conta que produza número de negócio (só formatação); "por usuário" e "% do faturamento" saem de `analisar` (A2).
- [ ] `model.mjs` não contém `50_000_000`, `0.02` de multa nem os valores IBM cravados — todos vêm de `data` (A3).
- [ ] Existe artefato versionado (`data.json._meta` ou `CALIBRACAO.md`) com a proveniência de cada número calibrado (A4).
- [ ] Cada hex da paleta aparece uma vez só (em `site-chrome.css`); nenhum `#0F2940`/`#C9A227` no `<script>` do RiskJud (A5).
- [ ] Nenhum número de calibração que exista no `data.json` está também cravado como texto no HTML sem justificativa (A6).
- [ ] `README.md` (ou `TEMPLATE.md`) documenta o molde de um novo app: pasta + `model.mjs` puro `(params, data)` + `data.json` com metadados + `model.test.mjs` + tokens `var(--brand-*)` (A7).
- [x] `node --test` existe e roda verde em `riskjud/model.test.mjs` (11 testes; roda no CI) (A1).
- [x] Os testes cobrem: monotonicidade, teto Art. 52 (agora vindo do `data.json`), `faturamento=0 ⇒ anpd=0`, `regimeDano` (via âncora), investimento e caso-âncora vs. `data.json` (A1).
- [x] Um erro deliberado de sinal no litígio faz **pelo menos um** teste falhar (monotonicidade de base/maturidade) (A1).
- [x] `riskjud/index.html` não contém nenhuma conta que produza número de negócio (só formatação via `brl*`/`fmtPct`); `por_usuario`, `anpd_pct_faturamento` e `exposicao_com_ano` saem de `analisar`, testados (A2).
- [x] `model.mjs` não contém `50_000_000`, `0.02` de multa nem os valores IBM cravados — vêm de `data.anpd`/`data.ibm_codb`; teste prova que trocar o teto no JSON muda o resultado (A3).
- [x] Existe artefato versionado com a proveniência de cada número calibrado: `riskjud/CALIBRACAO.md` + `data.json._meta` (versão/coleta/período); a metodologia do HTML referencia e injeta de lá (A4).
- [x] Cada hex da paleta aparece uma vez só (tokens `--brand-*` em `site-chrome.css`; hub e app são aliases); Plotly lê via `getComputedStyle` — zero hex no `<script>` (tints locais do disclaimer comentados como exceção) (A5).
- [x] Nenhum número de calibração do `data.json` cravado no HTML: prosa injetada via `data-dj` (metodologia, faixa IBM, contexto, rodapé, versão/coleta); única exceção justificada em comentário é a `meta description` (A6).
- [x] `README.md` documenta o molde ("Como criar um app"): pasta própria + `model.mjs` puro `(params, data)` + `data.json` com `_meta`/`CALIBRACAO.md` + `model.test.mjs` no CI + tokens `var(--brand-*)` (A7).
12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,15 @@ node --test riskjud/model.test.mjs
```

Cobre: 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).

## Como criar um app (o molde)

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):

1. **Pasta própria** (`/meu-app/`) com `index.html` + `model.mjs` + `data.json` + `model.test.mjs` (+ `CALIBRACAO.md` se houver dado calibrado).
2. **`model.mjs` é puro**: exporta UMA função `(params, data) => resultado`, sem DOM, rede, `Date` ou `Math.random`. Toda grandeza que a tela exibe **sai pronta do modelo** — a view só formata (`brl`, `fmtPct`), nunca calcula número de negócio.
3. **`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 num `CALIBRACAO.md` ao lado; a prosa do HTML injeta os números do JSON (atributos `data-dj`), não os digita.
4. **`model.test.mjs` com `node --test`** (zero deps): determinismo, monotonicidades, tetos e um caso-âncora contra o `data.json`. O CI roda `node --test` na raiz — teste novo entra de graça.
5. **Cores via `var(--brand-*)`** de `../site-chrome.css` — nenhum hex no app; gráficos (Plotly etc.) leem os tokens com `getComputedStyle(document.documentElement)`.

Referência viva das 5 convenções: `/riskjud`.
9 changes: 5 additions & 4 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@
<link href="https://fonts.googleapis.com/css2?family=Inter+Tight:wght@300;400;500;600;700&family=Fraunces:opsz,wght@9..144,400;9..144,500;9..144,600&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="site-chrome.css" />
<style>
:root {
--marine:#0F2940; --purple:#4A1942; --green:#2E5D4F; --gold:#C9A227;
--ink:#1C1E22; --muted:#565A60; --stone:#D4D8DD; --cream:#ECEEF1;
--offwhite:#F6F8FA; --white:#FFFFFF;
:root { /* paleta: só aliases — os hex moram em site-chrome.css (A5) */
--marine:var(--brand-marine); --purple:var(--brand-purple); --green:var(--brand-green);
--gold:var(--brand-gold); --ink:var(--brand-ink); --muted:var(--brand-muted);
--stone:var(--brand-stone); --cream:var(--brand-cream); --offwhite:var(--brand-offwhite);
--white:var(--brand-white);
}
* { box-sizing:border-box; font-family:'Inter Tight',system-ui,sans-serif; }
body { margin:0; background:var(--cream); color:var(--ink); line-height:1.5; }
Expand Down
54 changes: 54 additions & 0 deletions riskjud/CALIBRACAO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# RiskJud — proveniência da calibração

> Item A4 da auditoria: **de onde vem cada número** que o modelo usa. O
> `data.json` guarda os valores; este arquivo, versionado ao lado, guarda a
> origem e o método. A prosa do `index.html` é injetada do `data.json`
> (atributos `data-dj`) — não digite números lá.

Regra de fronteira do app: **`model.mjs` = fórmula · `data.json` = calibração
e lei · este arquivo = método**. Se um número novo entrar no modelo, ele entra
pelo `data.json` e ganha uma linha aqui.

## Dado medido (`data.json`)

| Campo | Valor (jun/2026) | Origem e método |
|---|---|---|
| `benchmark.valor_medio_causa` / `jurisprudencia.valor_medio` | R$ 11.346,43 | Média dos **675 acórdãos com valor** (de 1.968 acórdãos de LGPD coletados via JurisFonte + TJES, 13 UFs). Usada no valor esperado — estatístico correto para probabilidade × magnitude. |
| `jurisprudencia.valor_mediano` | R$ 5.000,00 | Mediana dos mesmos 675 — o caso típico; exibida como contexto, não entra no cálculo. |
| `benchmark.taxa_procedencia` | 0,6967 | Fração dos acórdãos procedentes no agregado nacional. Ajustada em runtime pelo regime de dano (juízo, ver abaixo). |
| `jurisprudencia.por_uf` | 13 UFs | Contagem/média/mediana por tribunal de origem dos acórdãos. Concentração SP/RS reflete parte cobertura de indexação, parte volume real. |
| `fonte.datajud_processos` / `datajud_por_ano` | 4.878 / ~813 | Processos classificados como proteção de dados no **DataJud/CNJ**, 34 tribunais, 2020–2025; média anual do período. |
| `fonte.calibracao_erro` | 8,6% | Erro entre as **ações/ano previstas** pelo modelo (parâmetros default, agregado nacional) e o volume DataJud. Valida o volume nacional, **não** o R$ por empresa. |

## Lei e referência de mercado (`data.json`)

| Campo | Valor | Origem |
|---|---|---|
| `anpd.multa_pct` / `anpd.multa_max` | 2% / R$ 50M | **Art. 52 da LGPD** — teto por infração. É lei, não estimativa; muda por lei, edita-se aqui. |
| `ibm_codb.brasil` / `por_setor` | R$ 7,19M · saúde 11,43M · finanças/seguros 8,92M | **IBM Cost of a Data Breach 2025** (Brasil). Custo TOTAL de incidente — métrica diferente da indenização; referência de mercado, não se soma às camadas. |

## Juízo editorial (constantes em `model.mjs`, disclosed na UI)

Estes multiplicadores **não têm base amostral própria** — são premissas
editoriais ajustáveis; a UI os declara em "Medido vs. juízo":

- `PORTE_BREACH_BASE` (12–40%/ano) e `DATA_TYPE_BREACH_MULT` — propensão a vazamento por porte/tipo de dado; é a premissa que mais move a magnitude.
- `MATURITY_REDUCTION` e as curvas de `investmentEffectiveness` — âncoras: R$ 1/usuário ≈ −15%/−10%, R$ 10/usuário ≈ −54%/−40% (curva saturante, sem degraus).
- `BREACH_SCENARIOS` (1% / 5% / 15% dos usuários afetados).
- `SETOR_DANO_MULT` — **financeiro 1,26× (n=42)** e **varejo 1,55× (n=27)** têm amostra (subconjunto dos acórdãos); os demais setores usam 1,0 neutro por falta de base (`SETOR_N`).
- `PROCEDENCIA_FATOR` (presumido 1,12 / misto 1,0 / comprovar 0,85) — doutrina STJ: dano presumido *in re ipsa* para dado sensível; fator sobre a taxa-base medida, não taxa por tipo.
- `P_SUE_PERCAPITA` (+ teto de 5%) — fração dos afetados que litiga, ancorada no volume nacional (~813 ações/ano vs. milhões de expostos).
- `ANPD_P_FINE` (0,5–2%) — P(multa | vazamento) recalibrada à fiscalização real (pouquíssimas multas até 2025); `ANPD_GRAVIDADE` por tipo de dado.
- Fator 1,2 de responsabilidade solidária — Art. 42 da LGPD.

## Recalibração

O alvo legal está em movimento (STJ e ANPD, 2023–2025). Para recalibrar:

1. Re-rodar a coleta (DataJud/CNJ + JurisFonte/TJES) e atualizar `data.json`
(benchmark, jurisprudencia, fonte) e `_meta.coleta`/`periodo`/`versao`.
2. Atualizar a referência IBM anual (`ibm_codb`) e, se a lei mudar, `anpd`.
3. Rodar `node --test` — o caso-âncora quebra se o benchmark mudar
(atualizá-lo é parte da recalibração consciente).
4. Atualizar a `meta description` do `index.html` (única duplicação estática,
marcada com comentário) e este arquivo.
25 changes: 21 additions & 4 deletions riskjud/data.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,26 @@
{
"_meta": {
"versao": "v2.1",
"coleta": "2026-06-27",
"periodo": "2020–2025",
"proveniencia": "Origem e método de cada número: CALIBRACAO.md, ao lado deste arquivo."
},
"benchmark": {
"valor_medio_causa": 11346.43,
"taxa_procedencia": 0.6967
},
"anpd": {
"multa_max": 50000000,
"multa_pct": 0.02
},
"ibm_codb": {
"brasil": 7190000,
"por_setor": {
"saude": 11430000,
"financeiro": 8920000,
"seguradora": 8920000
}
},
"jurisprudencia": {
"total_acordaos": 1968,
"total_com_valor": 675,
Expand Down Expand Up @@ -107,8 +125,7 @@
"fonte": {
"datajud_processos": 4878,
"datajud_por_ano": 813,
"ibm_codb_2025_brasil": 7190000,
"calibracao_erro": 0.086,
"data_coleta": "2026-06-27"
"datajud_tribunais": 34,
"calibracao_erro": 0.086
}
}
}
Loading
Loading