From ec961adfd5da7c33c00d50b4e81d89379507c702 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 1 Jul 2026 04:20:32 +0000 Subject: [PATCH 1/3] docs: auditoria de arquitetura vs. fundamentos de software (Matt Pocock) Compara a arquitetura contra os 5 fundamentos de "Software Fundamentals Matter More Than Ever" (Matt Pocock), adaptados a um contexto estatico/no-build. Notas: linguagem ubiqua=forte; fatias verticais=forte; TDD=fraco; modulos profundos=forte; ocultacao de informacao=parcial. Achados-chave: matematica juridica calibrada em jurisprudencia (model.mjs) sem nenhum teste, sendo alvo ideal de node --test (puro, deterministico); calculos de dominio vazam da view (index.html) para dentro do modelo; constantes legais (teto ANPD, IBM) cravadas no .mjs em vez de data.json. Co-Authored-By: Claude Claude-Session: https://claude.ai/code/session_018qgnHZkTUK5SR4PRDfm3KA --- AUDITORIA-ARQUITETURA.md | 280 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 AUDITORIA-ARQUITETURA.md diff --git a/AUDITORIA-ARQUITETURA.md b/AUDITORIA-ARQUITETURA.md new file mode 100644 index 0000000..0fc9bae --- /dev/null +++ b/AUDITORIA-ARQUITETURA.md @@ -0,0 +1,280 @@ +# Auditoria de Arquitetura — Apps (ferramentas estáticas) + +> Base: Janilo/apps (branch atual). Stack: HTML + ES modules vanilla, sem build, Cloudflare Pages. App atual: RiskJud (LGPD). +> Referência: Matt Pocock, "Software Fundamentals Matter More Than Ever" (https://www.youtube.com/watch?v=v4F1gFy-hqg). +> Escopo: arquitetura (fatias, módulos, interfaces, testes) adaptada a um contexto estático/vanilla. Não avalia UI, copy ou a validade jurídica dos números — só como o código está organizado. + +--- + +## Sumário executivo + +| Princípio | Nota | Veredito em 1 linha | +|---|---|---| +| 1 · Linguagem ubíqua (DDD) | ✅ | `model.mjs` fala LGPD fluente: `regimeDano`, `litigioEsperado`, `anpdSeMultar`, `PROCEDENCIA_FATOR`, `in re ipsa` — domínio e código são a mesma língua. | +| 2 · Fatias verticais | ✅ | `/riskjud` é uma capacidade completa (view + modelo + dados) que roda ponta-a-ponta sem servidor. Fatia quase-ideal. | +| 3 · TDD | 🔴 | Zero testes sobre matemática pura, determinística e calibrada em dado de tribunal. É o alvo mais fácil e mais perigoso do portfólio. | +| 4 · Módulos profundos (Ousterhout) | ✅ | `analisar(params, data)` é uma boca só escondendo ~15 constantes e 8 funções de cálculo. Interface pequena, implementação densa. | +| 5 · Ocultação de informação & design de sistema | 🟡 | `data.json` é uma boa fronteira de calibração e o hub está documentado; mas números jurídicos e a paleta vazam/duplicam entre camadas, e a *proveniência* da calibração vive em prosa no HTML, não versionada ao lado do dado. | + +**Tese.** A leitura do Pocock é que código não é o gargalo — julgamento é; a IA é um programador tático brilhante que precisa de um estrategista. Aqui a natureza estática/no-build **joga a favor** de quase todos os fundamentos, não contra. A fatia vertical, que em apps com framework exige disciplina, aqui é o *default físico*: uma pasta = uma ferramenta = UI + lógica + dado, sem acoplamento a runtime. O módulo profundo já existe: `analisar()` é uma função pura `(params, data) → resultado`. A linguagem ubíqua é genuinamente boa. As duas lacunas reais são as que o Pocock mais destacaria: (a) **não há testes** sobre a única coisa que *precisa* estar certa — a conta de risco jurídico calibrada em jurisprudência; e (b) a **proveniência da calibração** (de onde saem `0.6967`, `11346.43`, os multiplicadores) não está versionada junto ao dado, então o "mapa vivo" do sistema depende de um `
` de HTML. Ambas são baratas de corrigir sem abandonar a filosofia no-build (`node --test` nativo; um bloco de metadados no `data.json`). + +--- + +## A arquitetura em uma tela + +``` +apps/ (Cloudflare Pages · estático · sem build) +├── index.html hub: lista os apps (fatia = card → /riskjud/) +├── site-chrome.css chrome compartilhado (header/footer, classes sc-*) +├── README.md mapa do sistema (documented system — Pocock +) +├── .github/workflows/ deploy.yml → wrangler pages deploy +└── riskjud/ ── FATIA VERTICAL ──────────────────────────── + ├── index.html VIEW: DOM, inputs, Plotly, permalink, formatação + ├── model.mjs LÓGICA: analisar(params, data) — matemática pura + └── data.json DADOS: benchmark + jurisprudência + fonte (calibração) +``` + +Fronteiras desenhadas (o "molde" para futuros apps): + +- **view ↔ modelo:** `index.html:341` `import { analisar } from './model.mjs'`. O HTML lê inputs (`readParams`, :352), chama `analisar`, formata a saída. Uma única superfície. +- **modelo ↔ dados:** `analisar(params, data)` recebe `data` por parâmetro (:167); a calibração não é `import`-ada nem embutida — o HTML injeta via `fetch('./data.json')` (:499). Boa inversão: o modelo não sabe de onde o dado vem. +- **chrome compartilhado:** `site-chrome.css` (`../site-chrome.css`, :11) é a fronteira comum entre hub e apps. + +--- + +## 1 — Linguagem ubíqua + +**Nota: ✅** + +Este é um ponto forte real. O vocabulário do domínio jurídico/LGPD aparece intacto no código, não traduzido para termos genéricos de programação. + +- Funções nomeadas pelo conceito de domínio, não pela mecânica: `pBreachBase` (`model.mjs:70`), `pSueBase` (:75), `pMultaBase` (:88), `regimeDano` (:116), `gravidadeMax` (:105), `dataAttractiveness` (:61), `investmentEffectiveness` (:97). +- Constantes que carregam a doutrina: `PROCEDENCIA_FATOR = { presumido, misto, comprovar }` (`model.mjs:21`) mapeia direto o regime de dano do STJ; `ANPD_MULTA_MAX`/`ANPD_MULTA_PCT` (:32–33) são o Art. 52 nomeado; `FATOR_RESPONSABILIDADE_SOLIDARIA` (:39) é o Art. 42. +- A saída de `analisar` (`model.mjs:219–241`) é um dicionário em português do domínio: `esperado.litigio`, `esperado.anpd`, `pior_caso.litigio_se_vazar`, `pior_caso.anpd_se_multar`, `procedencia.regime`. O HTML consome esses mesmos nomes (`res.pior_caso`, :377; `res.procedencia.taxa`, :388) — **view e modelo falam a mesma língua**, sem camada de tradução. +- Os comentários ancoram o código na fonte doutrinária, não em jargão técnico: `dano presumido (in re ipsa)` (:20, :114), `taxa-base medida no agregado (0,6967)` (:20), `Art. 52 LGPD` (:31). Isso é exatamente o "glossário executável" que o Pocock defende. +- Os IDs do HTML espelham o domínio: `#p_breach`, `#p_sue`, `#p_multa`, `#d_saude`, `#reincidencia`, `#provas` (`index.html:164–206`), e o `data.json` idem (`valor_medio_causa`, `taxa_procedencia`, `datajud_por_ano`). + +Ressalva menor (não derruba a nota): há uma leve inconsistência PT/EN interna ao modelo — variáveis locais em inglês (`affected`, `benchmark`, `impactoReduction`, :125–139) convivem com o vocabulário PT do domínio. É idiomático em JS e não vaza para a interface pública, mas para um glossário 100% consistente o ideal é uma língua só nos nomes de domínio. + +--- + +## 2 — Fatias verticais + +**Nota: ✅ (força natural — creditada)** + +Aqui a arquitetura estática **é** a fatia vertical, sem esforço. Cada pasta (`/riskjud`) é uma capacidade de negócio completa e independente: interface (`index.html`), regra (`model.mjs`) e dado (`data.json`), rodando ponta-a-ponta no navegador, sem backend, sem estado compartilhado com outros apps. É o oposto da "arquitetura em camadas horizontais" que o Pocock critica — não existe um "camada de serviços" global que todo app tenha que atravessar. Adicionar/remover um app é adicionar/remover uma pasta. **Isto deve ser creditado como um caso quase-ideal de vertical slice** e preservado. + +Dentro da fatia, os limites entre as três camadas estão em sua **maioria** limpos — mas há vazamentos concretos a corrigir: + +**O que está limpo:** +- A lógica de risco está toda em `model.mjs`. O `