# Rastreabilidade — SDR ↔ implementação ↔ teste

Mantenha esta tabela alinhada aos `sdr-*.md` aprovados ou em validação. Um item de implementação é considerado **vinculado** se constar aqui **ou** em comentário no código (`SDR: sdr-NNNN-...`) **ou** na seção **17.2** do SDR correspondente.

**Política geral** (quando usar `traceability.md` vs comentário `SDR:` vs §17.2): [sdr-0022-repositorio-convencoes-e-construcao.md](./sdr-0022-repositorio-convencoes-e-construcao.md) §8 e §17.2.

| Item implementado | Arquivo | SDR | Requisito / critério | Teste / verificação | Status |
|-------------------|---------|-----|----------------------|----------------------|--------|
| Visualização Markdown no site (`ver-md.html`) | `arquitetura-contratual/site/assets/js/ver-md.js` | sdr-0017-site-html-rastreabilidade | Leitura segura de `.md` via parâmetro `f` relativo a `site/` | Abrir `ver-md.html` com `?f=` apontando para um `.md` sob `site/` ou `../../SDRs/` | ok |
| Índice de busca estático do site | `arquitetura-contratual/scripts/gerar_site_search_index.py` | sdr-0017-site-html-rastreabilidade | Regenerar `site-search-index.js` a partir dos HTML em `site/` e `site/sdr/` | Rodar o script e validar busca na UI | ok |
| HTML estático por SDR (`site/sdr/`) | `arquitetura-contratual/scripts/gerar_html_estatico_sdrs.py` | sdr-0017-site-html-rastreabilidade | Corpo do SDR no primeiro GET (Notebook LM / crawlers); dependência `markdown` (ver `requirements-gerar-html-sdr.txt`) | Rodar após alterar `SDRs/sdr-*.md`; abrir `site/sdr/index.html` | ok |
| Verificação de links do site + inventário Notebook LM | `arquitetura-contratual/scripts/verificar_links_e_inventario_site.py` | sdr-0017-site-html-rastreabilidade | Valida `href`/`src` no disco; `ver-md.html?f=`; gera `site/diagnostico/relatorio-links-falhas.{md,json}` e `site/notebook-lm-urls.txt` | Rodar após sync + HTML estático; exit 0 sem falhas | ok |
| Glossário de siglas e tooltips (`abbr` + `title`) no site | `arquitetura-contratual/site/assets/js/siglas.js` | sdr-0017-site-html-rastreabilidade, sdr-0022-repositorio-convencoes-e-construcao | Chaves **C1-GOV**, **C2-OPR**, **C3-SEC** e textos alinhados ao site (§10.1 do 0022) | Abrir páginas com `siglas.js` e conferir tooltip nos três contratos | ok |
| Rótulos estendidos no site (migração C1/C2/C3 → GOV/OPR/SEC) | `scripts/apply_contract_labels_c1gov_c2opr_c3sec.py` | sdr-0022-repositorio-convencoes-e-construcao | Script idempotente; reexecutar após grandes merges de HTML se necessário | Rodar script e `gerar_site_search_index.py`; buscar por `C1` solto no site | ok |
| Conteúdo PPSI/GSI e links a sub-SDRs (C1/C2/C3) | `arquitetura-contratual/site/seguranca.html`, `governanca.html`, `operacao.html` | sdr-0014a, sdr-0015a, sdr-0016, sdr-0016a–sdr-0016f | Secção normativa, pirâmide de citação, tabela 0016a–f e remissões `ver-md` | Abrir `#normas-ppsi-gsi` e links; conferir Governança/Operação | ok |
| Bundle MD portátil (`file://`, `ver-md.html`) | `arquitetura-contratual/site/assets/js/portable-md-bundle.js` | sdr-0017-site-html-rastreabilidade | Gerado por `arquitetura-contratual/tools/gerar-bundle-md-portatil.mjs` a partir de `.md` sob `arquitetura-contratual/`, `SDRs/`, `processo-contratacao/`, `Dados-ibama/` | Após editar `.md` que entram no bundle, rodar o script e abrir `ver-md.html` | ok |
| Trilhas duplas no site (badge por página + legenda na top-nav) | `arquitetura-contratual/site/assets/js/nav.js`, `arquitetura-contratual/site/assets/css/base.css`, `arquitetura-contratual/site/index.html` | sdr-0017-site-html-rastreabilidade | Cada `.html` declara `<body data-trilha="servicos|contratual|comum">`; `nav.js` injeta badge no hero e legenda de cores na top-nav | Abrir páginas e conferir badge / cor da borda superior do link na top-nav; `index.html` exibe seção “Duas trilhas” | ok |
| Gate de acesso por token (hosting estático; ex.: Firebase) | `arquitetura-contratual/site/assets/js/access-gate.js`, `site/assets/config/access-tokens.example.json`, `firebase.json` na raiz | sdr-0017-site-html-rastreabilidade | Em `localhost` / `127.0.0.1` / `file:` o gate não roda; em demais hosts exige `assets/config/access-tokens.json` com array `tokens` não vazio; aceita `?access_token=` ou hash equivalente ou formulário; checagem no cliente com nomes de função ofuscados de propósito | Copiar exemplo para `access-tokens.json`, publicar e abrir URL com token válido; sem token, overlay pede entrada | ok |
| Glossário dos eixos (Modelo de Serviços × Arquitetura Contratual) | `SDRs/glossario-eixos.md`, `README.md` | sdr-0003-indice-fonte-unica | Vocabulário canônico; campo `Eixo` em todos os SDRs e coluna `Eixo` no índice | Conferir SDRs com `Eixo` em metadados e coluna no `sdr-0003` | ok |
| Artefatos KML/JS do mapa Ibama | `Dados-ibama/gerar_kml_mapa_ibama.py` | sdr-0020-dados-ibama-mapa-ativos-cmdb-kml | Coerência localidades × quantitativos × saídas KML/JS | Executar script e inspecionar KML/JS gerados | ok |
| Página Roadmap CS (tabela a partir do YAML) | `arquitetura-contratual/scripts/gerar_roadmap_cs_html.py` | sdr-0027-roadmap-central-servicos | Registro `SDRs/cs-roadmap/registro.yaml`; atualiza `site/roadmap-cs.html` entre marcadores | Rodar script após editar YAML; abrir `roadmap-cs.html` e conferir RM-0001 | ok |

## Convenções

- **SDR**: use o nome do arquivo sem extensão (ex.: `sdr-0017-site-html-rastreabilidade`).
- **Requisito**: ID da tabela de requisitos no SDR (ex.: `RF-001`) quando existir.
- **Status**: `ok` | `parcial` | `pendente` | `N/A`.
