# Fidelidade — Datação (séculos, anos, eras)

Auditoria de fidelidade MonumentosFR — dimensão **DATAÇÃO**. Data: 2026-09-01.
Convenção: **[C]** = confirmado no documento/dados-fonte; **[I]** = inferido/julgamento do auditor.

## Método

### Resumo do parser (`tools/build_dataset.py`, `parse_century_string`) [C]

Lê o CSV `raw/merimee.csv` (delimitador `|`, 46.760 registos, refs únicas) e deriva, para cada registo, `cmin`/`cmax` (séculos numéricos) e `era` a partir de `Siecle_de_la_campagne_principale_de_construction` (PRI) e `Siecle_de_campagne_secondaire_de_construction` (SEC). Lógica por parte (separador `;`), após remover `(?)`:

1. **Eras arqueológicas** (tabela `ERA_CODES`): `prehistoire` (inclui paléo/méso/néo), `protohistoire` (chalco/bronze/fer), `antiquite` (antiquité, gallo-romain, haut/bas empire). Se a parte contém uma era **e** não contém a palavra «siècle», fica só com a era e salta o resto. Nota: **não existem códigos de era para «moyen age», «haut moyen age» nem «temps modernes»** — estes são tratados como séculos no passo 4.
2. **Números junto de «siècle»** (regex aceita ordinais ASCII `e|eme|er|re|ᵉ`): todos os séculos 1–21 da parte; min→cmin, máx→cmax.
3. **Ordinal nu** (ex.: «12e» sem «siècle»): primeiro encontrado.
4. **Ano solto** 800–2035 → século `(ano-1)//100+1`.
5. **Eras com séculos** (`ERA_CENTURIES`, chave mais longa primeiro): «haut moyen age»→5–10, «moyen age»→5–15, «temps modernes»→16–18; haut/bas empire não dão séculos.

Agregação: PRI e SEC são fundidos com min/max; `era` = primeira era não nula entre campos, mas **dentro do mesmo campo a última parte com era sobrescreve as anteriores** (ex.: «Préhistoire;Protohistoire» → protohistoire). Sem séculos mas com era → sentinelas temporais (ex.: protohistoire −2200…−52). `camp` (ficha) deriva de PRI/SEC em buckets de século (ex.: 19e siècle → 1800–1899). [C] no código.

### Verificação independente

1. Leitura semântica, caso a caso, de 83 registos estratificados (35 casos-limite intencionais + 40 estratificados por `cmin` 1–20 + 6 só-era + 4 vazios; amostra aleatória seed=42), comparando com `cmin`/`cmax`/`era` servidos em `www/explorer/merimee_data.json`. [C]
2. Re-derivação independente com **parser próprio** (regex tolerante a `è/ème`, numerais romanos, «République romaine», hífens, «av. JC») sobre os 46.760 registos, para detetar classes de divergência além da amostra. [C]
3. Sanidade de população via agregações do JSON vs CSV. [C]

## Casos-limite

Veredictos: ✅ conforme · ⚠️ aceitável (interpretação) · ❌ erro do site · 🔵 erro do julgamento do auditor.

| ref | texto CSV (PRI ; SEC) | site cmin/cmax/era | julgamento independente | veredicto |
|---|---|---|---|---|
| PA00088801 (Tour Eiffel) | «4e quart 19e siècle» | 19/19/– | 19e século (Datation CSV «1888;1889»); granularidade século correta; `camp` = 1800–1899, temporal 1800–1899 [C] | ✅ [C] |
| PA00078577 | «4e quart 19e siècle» | 19/19/– | 19 | ✅ |
| PA00079886 | «2e moitié 18e siècle;19e siècle» | 18/19/– | 18–19 | ✅ |
| PA00089446 | «Haut Moyen Age» | 5/10/– | séc. 5–10; NÃO colapsa em moyen age (5–15); temporal 400–999 [C] | ✅ |
| PA00078582 | «Moyen Age» | 5/15/– | Idade Média ampla 5–15; convenção defensável | ✅ |
| PA00080515 | «Préhistoire» | –/–/prehistoire | era correta, sem séculos (por design) | ✅ |
| PA00078925 | «Protohistoire» | –/–/protohistoire | idem | ✅ |
| PA00079292 | «Antiquité» | –/–/antiquite | idem | ✅ |
| PA00078516 | «13e siècle;14e siècle» | 13/14/– | 13–14 | ✅ |
| PA00082320 | «limite 15e siècle 16e siècle» | 15/16/– | «limite» = viragem 15→16; ambos capturados | ✅ |
| PA00080045 | «2e quart 16e siècle;limite 17e siècle 18e siècle» | 16/18/– | 16–18 | ✅ |
| PA71000026 | «Antiquité;Haut Moyen Age» | 5/10/antiquite | era cobre a Antiguidade; séculos 5–10 cobrem o HMA (séc. a.C. não representáveis) | ⚠️ |
| PA00081371 | «4e siècle av. JC;3e siècle av. JC» | 3/4/– | séculos **a.C.** lidos como d.C.; devia ser era=antiquite (ou séculos negativos) | ❌ |
| PA00081638 | «4e siècle av. JC;10e siècle» | 4/10/– | parte a.C. tratada como d.C. | ❌ |
| PA00081335 | «3e siècle av. JC;1er siècle» | 1/3/– | mistura a.C./d.C. sem marcação | ❌ |
| PA00083020 | «Gallo-romain (?)» | –/–/antiquite | `(?)` removido; era correta | ✅ |
| PA00083139 | «12e siècle (?)» | 12/12/– | 12 | ✅ |
| PA00083141 | «12e siècle (?);13e siècle (?);16e siècle» | 12/16/– | 12–16 | ✅ |
| PA33000237 | «3e quart 19e siècle» ; «1852» | 19/19/– | 1852 ∈ séc. 19; coerente | ✅ |
| PA39000135 | «1er quart 20e siècle» ; «1921;1923» | 20/20/– | tudo séc. 20 | ✅ |
| PA97200050 | «20e siècle» ; «extension: 1988» | 20/20/– | 1988 → séc. 20 | ✅ |
| PA35000085 | «fin du 3e siècle;15e siècle» ; «fouilles de sauvetages : 19e-20e;1958» | 3/20/– | span 3→20 fiel (inclui campanha de fouille 1958→20) | ✅ |
| PA33000234 | «12e siècle» ; «XIXe siècle» | 12/12/– | campanha secundária séc. 19 perdida (numerais romanos não suportados) | ❌ |
| PA82000048 | «17e siècle» ; «XIXe siècle» | 17/17/– | idem | ❌ |
| PA03000061 | «14e siècle» ; SEC com «XVIe/XVIIème siècle», «Moyen-Age au XIXe siècle» | 14/14/– | SEC ignorado (romanos + «Moyen-Age» com hífen) | ❌ |
| PA84000077 | «Début 14ème et 2ème moitié du 17ème siécle (église);début 18ème siécle (cloître);19e siècle» | 19/19/– | ideal 14–19; ordinais «ème» + typo «siécle» não reconhecidos; só a última parte conta. Nota: o regex tolerante do auditor TAMBÉM falhou aqui («siécle» tem `é`, não `è`) [C] | ❌ |
| PA84000078 | «Fin XVème - début du XVIe siècle» ; «XVIIIe siècle» | –/–/– | perda total (romanos); o `Format_abrege` («15e s. ; 16e s.») tinha a informação e não é usado como fallback | ❌ |
| PA00101207 | «Moyen-Age» | –/–/– | hífen não normalizado no passo de eras → devia ser 5–15 | ❌ |
| PA00112862 | «16è siècle» | –/–/– | ordinal «è» não reconhecido → devia ser 16 | ❌ |
| PA02000102 | «1ère moitié 20ème siècle» | –/–/– | «ème» + «ère» com `è` não reconhecidos → devia ser 20; FMT «20e s.» disponível | ❌ |
| PA00078963 | «Temps modernes» | 16/18/– | convenção 16–18 defensável | ✅ |
| PA00096652 | «Milieu du Moyen Age;19e siècle;20e siècle» | 5/20/– | «milieu du Moyen Age» ≈ séc. 10; site dá 5–15 (largo mas defensável) | ⚠️ |
| PA00089724 | «Fin du Moyen Age» | 5/15/– | ideal ≈ 14–15; site 5–15 | ⚠️ |
| PA00078868 | PRI vazio ; «milieu 12e siècle;1er quart 13e siècle;18e siècle» | 12/18/– | SEC-only corretamente fundido | ✅ |
| PA00080453 | «1er siècle» | 1/1/– | séc. 1 d.C. | ✅ |

## Amostra estratificada

40 registos aleatórios estratificados por `cmin` (2 por século 1–20), 6 só-era (Néolithique), 4 vazios — todos **conformes** [C]:

| estrato | exemplos | site | julgamento | veredicto |
|---|---|---|---|---|
| cmin=1 | PA00106722 «Gallo-romain;4e quart 1er siècle», PA00081182 «1er quart 1er siècle» | 1/1 + era antiquite (1º); 1/1 (2º) | séc. 1 | ✅ |
| cmin=2 | PA00080237 «Gallo-romain;2e siècle», PA00103104 «2e siècle» | 2/2 | 2 | ✅ |
| cmin=3 | PA00096747 «3e siècle;5e siècle», PA00113102 «Haut-Empire;3e siècle» | 3/5; 3/3+antiquite | 3–5; Haut-Empire coberto pela era | ✅ / ⚠️ |
| cmin=4 | PA00084196 «4e siècle;5e siècle», PA00081179 «4e siècle» | 4/5; 4/4 | 4–5; 4 | ✅ |
| cmin=5 | PA34000056 «Moyen Age», PA00083928 «Moyen Age;17e siècle» | 5/15; 5/17 | 5–15; 5–17 | ✅ |
| cmin=6 | PA00109964 «6e;11e;12e», PA04000028 «limite 6e siècle 7e siècle;14e siècle» | 6/12; 6/14 | 6–12; 6–14 | ✅ |
| cmin=7 | PA00085465 «7e;14e;15e;17e», PA00105620 «7e siècle» | 7/17; 7/7 | idem | ✅ |
| cmin=8 | PA00085414 «8e;13e», PA00081530 «8e;11e;15e» | 8/13; 8/15 | idem | ✅ |
| cmin=9 | PA00079978 «9e;11e», PA00081509 «9e;1er quart 19e siècle» | 9/11; 9/19 | idem | ✅ |
| cmin=10 | PA00114656 «10e;13e», PA00097336 «10e;12e;16e» | 10/13; 10/16 | idem | ✅ |
| cmin=11 | PA00103373 «2e moitié 11e;14e;15e;18e», PA00107800 «11e;13e;14e;19e» | 11/18; 11/19 | idem | ✅ |
| cmin=12 | PA00079892, PA00093921 «12e siècle» | 12/12 | 12 | ✅ |
| cmin=13 | PA00093606 «13e;15e», PA00104161 «13e siècle» | 13/15; 13/13 | idem | ✅ |
| cmin=14 | PA00095206 «14e», PA00092751 «14e;15e» | 14/14; 14/15 | idem | ✅ |
| cmin=15 | PA00113708 «15e», PA00099274 «15e;18e» | 15/15; 15/18 | idem | ✅ |
| cmin=16 | PA00094549 «1er quart 16e», PA00078190 «16e;18e» | 16/16; 16/18 | idem | ✅ |
| cmin=17 | PA00090023 «1ère moitié 17e», PA00102824 «17e siècle» | 17/17 | 17 (o qualificador de moitié perde-se — granularidade de século) | ✅ |
| cmin=18 | PA00117683 «4e quart 18e»; SEC «19e siècle», PA00097050 «18e siècle» | 18/19; 18/18 | idem | ✅ |
| cmin=19 | PA00088663 «19e», PA00094367 «2e quart 19e» | 19/19 | 19 | ✅ |
| cmin=20 | PA62000103 «2e quart 20e», PA00093357 «1er quart 20e» | 20/20 | 20 | ✅ |
| era-only | PA00089382, PA00101367, PA00089313, PA00118307, PA00100202, PA00112475 — todos «Néolithique» | –/–/prehistoire | era correta sem séculos | ✅ |
| vazio | PA62000181, PA00080548, PA00108243, PA00118093 | –/–/– | sem datação, coerente com CSV vazio [C] | ✅ |

**Balanço da amostra (83 registos): 75 conformes/aceitáveis, 8 erros do site → 90,4% de conformidade** (amostra deliberadamente enviesada para casos-limite). [C]

## Sanidade de população

Sobre os 46.760 registos servidos [C]:

- **Refs**: 46.760 no CSV e no JSON, coincidência 1:1, sem duplicados nem órfãos.
- **cmin**: presente em 37.516 (80,2%); mínimo 1, máximo 20. **cmax**: mínimo 1, máximo 21 (3 registos, todos com texto-fonte a mencionar «21e siècle», ex.: PA18000056 «2e moitié 20e siècle;1er quart 21e siècle»). **Nenhum valor fora de [-60, 21]**; **cmin ≤ cmax em 100% dos casos** (0 violações).
- **Distribuição por século (cmin)**: picos em 12 (5.132), 16 (5.326), 18 (5.008), 17 (4.808), 15 (4.015), 13 (2.565), 19 (3.740), 20 (2.380), 14 (1.843), 11 (1.326) — perfil típico do património francês (românico-gótico + moderno). Séculos 1–10 raros mas presentes. [C]
- **era** (modelo do site só tem 3 códigos): prehistoire 1.508 · antiquite 670 · protohistoire 303 · sem era 44.279. «moyen age»/«haut moyen age»/«temps modernes» **não** aparecem como era — viram séculos 5–15/5–10/16–18. [C]
- **Sem datação nenhuma (site)**: 6.968 (14,90%). **CSV com PRI e SEC vazios**: 6.960 (14,88%). Diferença: **8 registos** com texto mas sem datação derivada (4 perdas de parsing + 3 «République romaine» + 1 limite BC). [C]
- **era sem séculos**: 2.276 registos (por design — eras arqueológicas não povoam cmin/cmax; entram no temporal por sentinelas, ex. protohistoire −2200…−52). [C]

## Desvios

Classes detetadas pela re-derivação independente sobre a população inteira (149 divergências, categorizadas) [C]:

| classe | n | avaliação |
|---|---|---|
| Séculos **a.C.** lidos como d.C., sem era («4e siècle av. JC» → 4) | 11 | ❌ erro do site (semântico; família «av. JC») |
| Perda total de parsing («16è siècle», «Moyen-Age» c/ hífen, romanos «XV/XVI/XVIIIe», «1ère moitié 20ème siècle») | 4 | ❌ erro do site |
| Perda parcial na campanha SEC («Moyen-Age» na SEC: 2; numerais romanos na SEC: 3) | 5 | ❌ erro do site |
| «République romaine» sem era (devia ser antiquite) | 3 | ❌ erro do site (leve) |
| Precedência de era em texto multi-era (ex. «Préhistoire;Protohistoire» → protohistoire; regra real: última parte dentro do campo ganha) | ~109 | ⚠️ aceitável (escolha de precedência discutível mas consistente) |
| «Milieu/Fin du Moyen Age» → 5–15 (largo; ideal ≈ 9–11 / 14–15) | 26 | ⚠️ aceitável (impreciso) |
| Ordinais nus («12e;19e», «11e», «19e;20e») que o site apanha e o meu modelo não | 4 | 🔵 erro do meu julgamento (o site é MAIS capaz aqui) |
| «Age de fer» (variante que o site tem na tabela e o meu modelo não tinha) | 1 | 🔵 erro do meu julgamento |
| «Temps Moderne» (sem «s») sem séculos, mas bracketado por 14e/19e no mesmo campo (PA03000073) | 1 | ⚠️ aceitável |

**Total de registos com defeito real atribuível ao site: 23/46.760 ≈ 0,05%.** Casos conhecidos:

- **Tour Eiffel PA00088801**: PRI «4e quart 19e siècle» → cmin=cmax=19, `cp` «19e s.», `camp` [{s:1800, e:1899}], temporal s=1800/e=1899. ✔ CONFIRMADO. Nota: a precisão «1887-1889» (CSV `Datation_de_l_edifice` = «1888;1889» [C]) não é servida numericamente — granularidade de século por design. [C]
- **«Haut Moyen Age» NÃO colapsa para «moyen age» genérico**: ✔ CONFIRMADO — HMA puro dá 5–10 (47 refs com «haut moyen» no PRI; 19 puras = 5/10), contra 5–15 do Moyen Age; temporal 400–999 vs 400–1499. [C] Nota: não existe etiqueta de era «haut moyen age» (a diferenciação é feita só pelos séculos). [C]

## Veredicto

A derivação de datação é **globalmente fiel à fonte**: 80,2% dos registos têm séculos numéricos corretos, os intervalos são sempre bem formados (mín 1, máx 21, cmin≤cmax a 100%), e os 14,9% sem datação correspondem quase exatamente aos campos vazios do CSV (diferença de apenas 8 registos). Os casos conhecidos confirmam-se: a Tour Eiffel dá século 19 com `camp`/temporal 1800–1899, e «Haut Moyen Age» mantém-se distinto (5–10) do «Moyen Age» genérico (5–15). Os defeitos reais concentram-se em 23 registos (0,05%): séculos a.C. lidos como d.C. sem era (11), perdas de parsing por ordinais acentuados/hífen/numerais romanos (9) e «République romaine» sem era (3) — todos corrigíveis com normalização adicional (acentos, hífens, romanos, mapeamento BC→era antiquite) e, idealmente, uso do `Format_abrege` como fallback. **Conformidade populacional: 99,95%; conformidade na amostra de casos-limite (83): 90,4%** — a diferença reflete o enviesamento intencional da amostra para texto patológico. [C/I]

## Fontes

- CSV-fonte (verdade): `C:\Users\Atelier X\Nextcloud\Documents\00_Website\MonumentosFR\raw\merimee.csv` (delimitador `|`, 46.760 registos; colunas `Siecle_de_la_campagne_principale_de_construction`, `Siecle_de_campagne_secondaire_de_construction`, `Format_abrege_du_siecle_de_construction`, `Datation_de_l_edifice`, `Justification_de_la_datation`) [C]
- Dataset servido: `C:\Users\Atelier X\Nextcloud\Documents\00_Website\MonumentosFR\www\explorer\merimee_data.json` (chaves `cmin`, `cmax`, `era`, `cp`) [C]
- Ficheiros derivados consultados: `C:\Users\Atelier X\Nextcloud\Documents\00_Website\MonumentosFR\www\data\merimee-temporal.json` (sentinelas s/e), `C:\Users\Atelier X\Nextcloud\Documents\00_Website\MonumentosFR\www\data\merimee-detail-75.json` (`camp`) [C]
- Pipeline: `C:\Users\Atelier X\Nextcloud\Documents\00_Website\MonumentosFR\tools\build_dataset.py` (funções `parse_century_string`, `era_sentinels`; tabelas `ERA_CODES`, `ERA_CENTURIES`) [C]
- Fonte dos dados: https://www.data.gouv.fr/api/1/datasets/r/3a52af4a-f9da-4dcc-8110-b07774dfb3bc (Ministère de la Culture, base Mérimée, Licence Ouverte 2.0) [C]
