# Auditoria de fidelidade site ↔ scrape — Síntese

**Data:** 2026-09-02 · **Método:** painel de 8 agentes independentes (uma dimensão cada), verificação por população inteira sempre que exequível + amostras estratificadas com julgamento semântico humano-simulado (regra do projeto: ler realmente, sem heurísticas cegas). Fonte da verdade: `raw/merimee.csv` (46 760 registos, 78 colunas, delimitador `|`), o scrape de data.gouv.fr.

## Resultado global

| # | Dimensão | Conformidade | Relatório |
|---|----------|-------------|-----------|
| 1 | Identidade & localização (i/n/m/d/r) | **100%** — população inteira, 187 040 comparações, 0 divergências [C] | [01](01-identidade.md) |
| 2 | Datação (séculos/eras) | **99,95%** população; 23 registos (0,05%) com defeito real [C] | [02](02-datacao.md) |
| 3 | Proteção & statut | **~99,997%** — 3 divergências semânticas em 46 760 [C] | [03](03-protecao.md) |
| 4 | Uso & domínio/denominação | t1/t2 **100%**; ou/cu **0 erros semânticos nas atribuições**, lacunas de cobertura [I] | [04](04-uso.md) |
| 5 | Coordenadas | **100%** — 44 484/44 484 pares exatos; só o swap intencional PA95000004 [C] | [05](05-coordenadas.md) |
| 6 | Texto integral (fichas detail) | **100%** — somas batem à unidade (15 870 339 chars), 0 mojibake [C] | [06](06-texto.md) |
| 7 | Pessoas (extração LLM) | **≈0,1% de alucinação** (7/7 791, divergências de 1 letra); cobertura 100% [C] | [07](07-pessoas.md) |
| 8 | Agregados & joins | **100% dos números** (24/24 grupos rederivados); 2 notas de qualidade [C] | [08](08-agregados.md) |

**Conclusão:** os dados servidos correspondem ao scrape com fidelidade verificável de ~100% nas dimensões de cópia (identidade, coordenadas, texto, agregados) e ≥99,95% nas dimensões derivadas (datação, proteção). A classificação de uso (ou/cu) não tem erros conhecidos nas atribuições mas é [I] por construção (self-classification) e a fonte limita a cobertura (96,2% das destinations vazias no próprio CSV).

## Desvios encontrados (todos com ref no relatório respetivo)

> **Estado 2026-09-02: os 5 itens corrigíveis foram aplicados** (ver §«Correções aplicadas» abaixo).

**Corrigíveis, baixo esforço:**
1. **[02] 23 registos de datação mal parseados** — 11 «av. JC» lidos como d.C. sem era `antiquite`; 9 ordinais acentuados («16è», «20ème»); «Moyen-Age» hifenizado; numerais romanos; fallback `Format_abrege` não usado.
2. **[03] 3 registos de proteção** — PA95000004 «inscription MH» não apanhado pela substring «inscrit» (consta como sem proteção); PA00085775 tipologia vazia mas data com «inscrit MH»; PA35000085 «propriété publique et privée» → `publique` em vez de `mixte`.
3. **[08] Builders (Patterns) colapsa séculos no bin «1»** — o gerador trata `yr` (já século 1..20) como ano via `(c//100)+1`; totais certos, série temporal semanticamente vazia. É o único defeito visível num gráfico.
4. **[08] merimee-wikidata.json transporta 25 785 órfãos** (36% do ficheiro; refs P380 fora do dataset) — filtrar aos refs PA do dataset reduz o ficheiro sem perda funcional.
5. **[07] 71 grupos de quase-duplicados** de pessoas por hifenização (≈1,8% das entidades; sub-fusão da chave de normalização) e 7 nomes com divergência de 1 letra face ao CSV.

## Correções aplicadas (2026-09-02)

1. **Parser de datação** (`tools/build_dataset.py`): regexes passaram a correr sobre texto normalizado (acentos dobrados — fixa «16è», «20ème», «siécle»); «av. J.-C.»/«avant Jésus-Christ» → era `antiquite` sem séculos; numerais romanos («XIXe siècle», «XVème»); «Moyen-Age» com hífen; «République romaine» → `antiquite`; fallback `Format_abrege` quando PRI/SEC não parseiam. Testes `tools/test_parser.py` 33/33 (casos da auditoria + regressões). Verificação: 16/16 refs da auditoria PASS; eras reconciliam com a linha base (prehistoire 1.508, protohistoire 303, antiquite 686); sem datação 6.899 (dos 6.960 de CSV vazio, 61 recuperados via Format_abrege). [C]
2. **Proteção** (`tools/build_dataset.py` + `tools/classify_statut.py`): «inscription» conta como `inscrit`; fallback `prot_code(Date_et_typologie)` quando tipologia vazia; `classify_part` devolve `mixte` quando PUB e PRIV coexistem na mesma parte. Diff do `statut_map.json`: exatamente 1 chave mudou. `prc` autre 449→447 (os 2 previstos); `mixte` +1. [C]
3. **Builders** (`tools/build_patterns_data.py`): `yr` tratado como século. Gráfico «Bâtisseurs»: 1 ponto → 17 séculos reais [1e..20e], verificado no browser via instância Chart.js. [C]
4. **Wikidata** (`tools/fetch_wikidata.py`): filtrado aos refs do dataset + exclusão de blank nodes; modo `--offline` regenera do cache raw sem rede. 45.849 entradas (98,05% de cobertura, igual à auditoria; Tour Eiffel→Q243 ✓); ficheiro 3.5→1.1 MB. [C]
5. **Pessoas** (`tools/build_persons.py`): chave de fusão ignora hífens/espaços/vírgulas (71 grupos fundidos; 7.791→7.718 entidades, firmas 110→104); `NAME_FIXES` corrige os 7 nomes com 1 letra de desvio; dedup de monumentos por ref; nome canónico = grafia mais frequente, variantes em `aka`. [C]

**Bug adicional descoberto e corrigido durante a aplicação** (`tools/deploy.py`): os hashes dos assets para o HTML eram calculados ANTES do stamping de `fetch()` no JS — o HTML referenciava o hash do JS não-carimbado e browsers com cache serviam JS antigo com URLs de dados velhas (latente em qualquer deploy só-de-dados). Ordem corrigida (JS → hash → HTML); validação: 191 refs de asset em todas as páginas, 0 hashes errados. [C]

**Notas, sem ação obrigatória:**
- [04] cobertura `ou` 93,3% (3 150 sem categoria, compostos «a;b» fora do top-220); `cu` só 3,1% da população porque a fonte tem 96,2% de destinations vazias — comunicar na UI/Méthodologie.
- [04] 7 grupos de categorias duplicadas por capitalização (fragmentam filtros).
- [05] `raw/coord_outliers.json` obsoleto (10 entradas de build anterior); 70 registos Gironde com lng=0.0 por truncatura da própria fonte.
- [06] chaves curtas (`hist`, `desc`) e `.strip()` em 433 valores de borda (0,09%) — por desenho, sem perda.

## Fontes

- CSV-fonte (scrape): `raw/merimee.csv` ← https://www.data.gouv.fr/api/1/datasets/r/3a52af4a-f9da-4dcc-8110-b07774dfb3bc [C]
- Dataset servido: `www/explorer/merimee_data.json` · shards: `www/data/merimee-detail-*.json` · persons: `www/data/merimee-persons.json` · agregados: `www/data/merimee-*.json` [C]
- Pipelines auditados: `tools/build_dataset.py`, `tools/classify_statut.py`, `tools/build_persons.py`, `tools/build_patterns_data.py`, `tools/build_viz_data.py` [C]
- GeoJSON departamentos: https://github.com/gregoiredavid/france-geojson [C]
- Wikidata P380 (SPARQL): https://query.wikidata.org/ [C]
