---
id: REIMPL-ORDEM
tipo: reimplementacao
onda: 5
status: concluido
unidades: []
fontes:
  - V2/
  - app/
  - config/
  - database/
  - public/
  - .env.example
depende_de: [ARCH-OVERVIEW, CORE-BOOT, CORE-AUTH, CORE-DATA, CORE-RUNTIME]
consumidores: [equipe-de-reconstrucao, agente-reconstrucao-cega]
criticidade: alta
dono: agente-reimplementacao
---

## Efeito

Define a sequência executável de reconstrução da V2. O resultado esperado é um sistema
em que cada etapa entrega contratos observáveis já usados pelas etapas seguintes, de modo
que nenhuma equipe precise “voltar” para inventar schema, rota ou componente depois que
um consumidor já foi escrito.

A ordem não é a ordem dos diretórios do legado. Ela é derivada das arestas de dependência
declaradas nos documentos de unidade (`depende_de`), dos índices canônicos
(`_indices/rotas.csv`, `tabelas.csv`, `servicos.csv`, `permissoes.csv`, `config.csv`) e de
três restrições reais:

1. O boot descobre módulos e serviços pelo **nome do diretório** e publica rotas, views e
   migrations sem registro manual (`01_arquitetura/01-boot-autodiscovery.md:26-40,95-96`).
2. A pilha HTTP decide autenticação, RBAC, módulo ativo e cache **antes** do controller
   (`01_arquitetura/04-middlewares-seguranca.md:71-109`). Sem essa pilha, nenhum contrato
   de módulo é verificável.
3. Há ciclos de dependência declarados — Notícias ↔ Unidade Regional, Galeria ↔ Media,
   MailService → SLE — que precisam ser quebrados por **fatias de contrato**, não por
   etapas inteiras (§Particularidades).

Cada etapa abaixo declara: pré-requisitos, artefatos, contratos que precisam existir,
critério de saída observável e o que pode correr em paralelo.

**Leia junto com `pilha-alvo-public-v7.md`.** Os nomes de tabela, rota nomeada, classe e
biblioteca citados nas unidades são do legado; o contrato externo (URL, status, mensagem,
payload e semântica de dados) é o que se preserva. Não porte Sentinel, Bootstrap, jQuery,
nonce por request, `v2_*` ou `HtmlMinify` “por fidelidade”.

## Abordagem

### 1. Grafo real (arestas que mandam)

```text
E1 Fundação
 ├─ CORE-BOOT (autodiscovery, fallback, providers, migrations)
 ├─ CORE-DATA (UUID, migrações, transações, tags)
 ├─ CORE-AUTH (users, roles, Sentinel-equivalente, RBAC, pilha)
 └─ CORE-RUNTIME (cache de página, CSP, minify, manutenção, erros, assets)

E2 Serviços-base independentes
 ├─ SVC-STORAGE        (depende de CORE-CMS)
 ├─ SVC-ACTIVITYLOGGER (sem dependências)
 ├─ SVC-DIGITALSIGNATURE (CORE-BOOT, CORE-DATA)
 └─ SVC-MAILSERVICE-núcleo (SMTP + log; template final só em E6)

E3 Plataforma de configuração
 └─ MOD-SUPPORT-SUPPORTCONFIGS (tema CMS/portal, flags, manutenção, SMTP, portal configs)
      ↑ consumido por Mail, FeedRss, SEO, SLE, UI-PORTAL

E4 Serviços de UI núcleo
 ├─ SVC-MEDIA      (STORAGE, GALLERY* , EXCELIMPORTER)   *ciclo quebrado por contrato
 ├─ SVC-GALLERY    (STORAGE, MEDIA, ACTIVITYLOGGER)
 ├─ SVC-CONTENTRICHEDITOR (MEDIA, GALLERY, SEARCH*)
 └─ SVC-EXCELIMPORTER (CORE-BOOT, CORE-AUTH)

E5 Serviços de leitura/entrega
 ├─ SVC-SEO      (CORE-CMS, UI-PORTAL, MEDIA, SUPPORTCONFIGS)
 ├─ SVC-SEARCH   (CORE-BOOT/DATA/AUTH/RUNTIME)
 ├─ SVC-FEEDRSS  (ACTIVITYLOGGER, SUPPORTCONFIGS)
 └─ SVC-DASHBOARD (AUTH, DATA, SEARCH, SEO, ACTIVITYLOGGER)

E6 Plataforma de páginas
 ├─ MOD-SUPPORT-STRUCTURALLANDINGEDITOR (SUPPORTCONFIGS, GALLERY, STORAGE, ACTIVITYLOGGER)
 ├─ SVC-LANDINGSECTIONSEDITOR (GALLERY, CONTENTRICHEDITOR, STORAGE, CORE-RUNTIME)
 ├─ SVC-MAILSERVICE-final (template `email.default` sobre SLE)
 └─ MOD-LAYOUTS-BASICPAGE (SEO, SEARCH, MEDIA, GALLERY, UI-PORTAL, SLE indireto)

E7 Domínios
 ├─ E7.1 Notícias + fatia de contrato da Unidade Regional (modelo/categoria)
 ├─ E7.2 Unidade Regional completa + Associados + Parceiros Institucionais
 ├─ E7.3 Institucional (História, Fale Conosco, AssocieSe) + Publicações (Agenda, Trabalhe Conosco)
 ├─ E7.4 Infraestrutura (Certificado Digital, Gestão de Permissões, FeedRss CMS, MailAudit)
 └─ E7.5 Support/NoticiasImport (depende de Notícias + Unidade Regional)

E8 Composições
 ├─ MOD-LAYOUTS-HOMEPAGE
 └─ MOD-INSTITUCIONAL-SOBRENOS

E9 Dados iniciais de conteúdo
 └─ DATA-SEEDS-BASICPAGES, DATA-SEEDS-CONTENT, DATA-SEEDS-SLE
```

### 2. Etapas

#### E1 — Fundação

| Campo | Conteúdo |
|---|---|
| Pré-requisitos | Nenhum. Pilha-alvo decidida em `pilha-alvo-public-v7.md` (PHP 8.4/Laravel 12/PG 18; `src/core|services|layout|modules`; token canônico) e mapa de nomes `v2_* → token` aprovado. |
| Artefatos | Provider raiz com descoberta por diretório e manifesto em cache; loader de rotas `web/api/cms/fallback`; `IdGen` injetado (UUIDv7); migrations do schema-alvo (equivalência semântica das 87 do legado, com nomes canônicos); tabelas Sentinel (`users`, `roles`, `role_users`, `persistences`, `activations`, `reminders`, `throttle`); `v2_roles`; pilha de middlewares; views de erro CMS/portal; `PageCache`, `Csp`, `HtmlMinify`, `Maintenance`; layout CMS e layout portal mínimos; helpers `v2_uuid()`, `v2_can()`, `v2_version()`. |
| Contratos que precisam existir | Namespace de view `v2-<modulo>`/`v2-service-<servico>`; nomes de rota (`v2.cms.login`, `v2.cms.dashboard`); JSON de erro AJAX; `X-Cache-Status`; CSP com nonce; `users.last_login`; tabela `v2_roles.permissions_v2` com `{Módulo: none|read|write}`. |
| Critério de saída | `GET /login` → 301 `/cms/login`; login válido abre sessão; usuário sem role é desconectado com a mensagem literal; `GET /cms` responde 200 para role válido; `GET /slug-inexistente` retorna 404 com o catch-all registrado (o runtime de página só entra em E6); `POST` não recebe cache público; 404 CMS e portal usam views próprias; `migrate:fresh` cria o conjunto ativo do índice (57 linhas; 3 são arquivadas/removidas e não devem existir) sem `backup_*`. |
| Paralelizável | Sim, em três trilhas: (a) boot/rotas; (b) schema/migrations; (c) auth/RBAC. A trilha (c) só fecha depois de (b). Runtime/cache e layouts podem correr em paralelo com (b). |

Referências de contrato: `01_arquitetura/02-roteamento.md:317,350-357`;
`01_arquitetura/03-auth-rbac-sentinel.md:775-791`;
`01_arquitetura/05-persistencia-uuid-migracoes.md:412-419`;
`01_arquitetura/09-cache-csp-minify-maintenance.md:540-551`;
`01_arquitetura/11-satelites-build-config.md:534-543`.

**Dados de fundação** entram aqui, não em E9, porque são pré-requisito de autenticação e
de páginas: perfil `admin` e `regional`, linha `slug='geral'` em `v2_conexao_tags`,
18 chaves de `v2_portal_configs`, 7 flags de módulo, 3 controles de sistema, 3 perfis de
tema CMS e as 5 páginas fixas (`homepage`, `lgpd`, `acessibilidade`, `mapa-do-site`,
`ouvidoria`). Evidência: `05_modulos/Support/SupportConfigs/dados.md:483,573-618`;
`05_modulos/Layouts/BasicPage/spec.md:354`;
`01_arquitetura/05-persistencia-uuid-migracoes.md:414`.

#### E2 — Serviços-base independentes

| Campo | Conteúdo |
|---|---|
| Pré-requisitos | E1 (storage de config, tabela `activity_log`, `APP_KEY`, contratos de resposta). |
| Artefatos | `StorageService` + adaptadores local/S3; `ActivityLoggerService` + views de timeline/selo; `DigitalSignatureService` + `CertificateManager`, `PrivateKeyVault`, `PdfSigner`, temas de carimbo, `v2_digital_certificates`, `v2_signature_logs`; `MailService` núcleo (SMTP, `v2_mail_logs`, `MailResult`). |
| Contratos que precisam existir | Chave relativa de storage e URL `/storage/<path>`; `ActivityLoggerService::log(Model,string,array,?string)`; `DigitalSignatureService::{importCertificate,signPdf}`; `MailService::{send,test,getHistory}`; erros `CERT_*`, `SIG_*`; corpo de e-mail HTML. |
| Critério de saída | `put/url` gravam e resolvem no disco correto; timeline renderiza; importar PFX grava 1 linha e a chave só decifra com mesmo `APP_KEY` + `user_id`; envio SMTP grava `sent`/`failed` sem lançar; falha de transporte não vira 500. |
| Paralelizável | Sim: Storage → (Media/Gallery futuro); ActivityLogger isolado; Assinatura isolada; Mail núcleo isolado. |

Referências: `02_servicos-base/storage.md:34,43-44,468`;
`02_servicos-base/activity-logger.md:569-583`;
`02_servicos-base/digital-signature/spec.md:668-682`;
`02_servicos-base/mail-service.md:548-558`.

#### E3 — Plataforma de configuração

| Campo | Conteúdo |
|---|---|
| Pré-requisitos | E1; E2 (ActivityLogger para auditoria de config). |
| Artefatos | `SupportConfigs`: `v2_portal_configs`, `v2_cms_theme_configs`, `v2_system_controls`, `v2_module_flags`, `v2_system_mail_configs`; `CmsThemeComposer`; manutenção; `ModuleFlagService`; telas CMS de tema/portal/logs/módulos; middleware `module.active`. |
| Contratos que precisam existir | `config('v2.support.email')`; `maintenance_mode` só `'true'`; `app_debug`; flags por módulo com default ativo; chaves de tema e metadados; senha SMTP cifrada com `APP_KEY`. |
| Critério de saída | Tema do CMS e do portal reflete as chaves; flag desligada bloqueia rotas do módulo (404 em prefixo composto, redirect no prefixo `cms`); manutenção retorna 503 HTML/JSON; senha SMTP nunca retorna em claro. |
| Paralelizável | Parcialmente. Tema CMS e tema portal são independentes; flags/manutenção dependem da pilha de E1. MailService e FeedRss podem começar quando o contrato de `v2_system_mail_configs` e o de flags existirem. |

Referências: `05_modulos/Support/SupportConfigs/spec.md:607-622`;
`05_modulos/Support/SupportConfigs/dados.md:483-487,598-618`;
`01_arquitetura/04-middlewares-seguranca.md:240-260`.

#### E4 — Serviços de UI núcleo

| Campo | Conteúdo |
|---|---|
| Pré-requisitos | E2 (Storage) e, para Gallery, o contrato de Media; para CRE, o contrato de Gallery/Media; ExcelImporter depende apenas de E1. |
| Artefatos | `MediaInputer` e otimizadores (imagem/PDF/áudio/planilha); `GalleryService`, `GallerySender`, `v2_gallery_media`, picker; `ContentRichEditor` (AST, renderers, upload, modais, bundle JS); `ImportExcelService`, schema declarativo, template XLSX, NDJSON, transpiler. |
| Contratos que precisam existir | `MediaInputer::processUpload` e mapa de variantes; `GalleryService::{upload,listMedia,find,archive,restore,update,rotate,delete}` e IDs `int`; AST JSON do editor e `toHtml()/toMarkdown()`; `ImportExcelService::{previewImportExcelData,processImportExcelData}`; limites `max:10240` e whitelist MIME. |
| Critério de saída | Upload de imagem grava original + variantes `360/720/1200/1920` (ou `original`) e registra 1 linha; picker devolve `(id,url,alt,mimeType,description)`; AST desconhecido não derruba o render; planilha inválida gera relatório, não 500. |
| Paralelizável | Sim, com uma exceção: `Media → Gallery` é sequencial; `CRE` e `ExcelImporter` correm em paralelo depois de Gallery/Storage. O ciclo declarado `Media → Gallery → Media` é quebrado por contrato: primeiro `GalleryConfig`/`v2_gallery_media`, depois `MediaInputer` usa o ID. |

Referências: `03_servicos-ui/media/spec.md:590-603`;
`03_servicos-ui/gallery/spec.md:872-886,107`;
`03_servicos-ui/content-rich-editor/spec.md:847-995`;
`03_servicos-ui/excel-importer/spec.md:626-639`.

#### E5 — Serviços de leitura e entrega

| Campo | Conteúdo |
|---|---|
| Pré-requisitos | E1 (auth/dados), E2 (ActivityLogger/Storage), E3 (SupportConfigs), E4 (Media para SEO/Gallery para Search). |
| Artefatos | `SEOService`, composer de metadata, `robots.txt`, `sitemap.xml`, `v2_seo_page_visits`; `SearchService`, `PublicIndexerService`, `CMSIndexerService`, índices e comando de reindexação; `FeedRssService`, `FeedSender`, `v2_feed_rss_items`, `/feed.xml`; `DashboardStatsService`. |
| Contratos que precisam existir | Precedência de SEO (`metadata[seo] > default do modelo/slug > v2_portal_configs > literal`); `publicSearch($term)` e `cmsSearch($term)`; URL pública por módulo/slug; UPSERT por `(entity_type,entity_id)`; RSS 2.0 com `guid`/`pubDate`; contadores do dashboard. |
| Critério de saída | `/busca` devolve até 20 resultados; `/cms/search` até 10; `/feed.xml` é XML válido com no máximo `v2.feed_rss.limit`; robots/sitemap respondem 200; segunda requisição pública devolve `X-Cache-Status: HIT`. |
| Paralelizável | Sim: SEO, Search e FeedRss são independentes entre si; Dashboard é o último porque agrega os três. |

Referências: `03_servicos-ui/seo/spec.md:688-702`;
`03_servicos-ui/search/spec.md:540-549`;
`02_servicos-base/feed-rss.md:546-558`;
`02_servicos-base/dashboard.md:479-487`.

#### E6 — Plataforma de páginas

| Campo | Conteúdo |
|---|---|
| Pré-requisitos | E3 (SupportConfigs), E4 (Gallery/Media/CRE), E5 (SEO/Search). |
| Artefatos | `StructuralLandingEditor` (8 áreas, `BlockRenderer`, File Library, temas, features); `LandingSectionsEditor` (registry, 21 widgets padrão + widgets de módulo, 22 formulários, preview); `MailService` final (`email.default`); `BasicPage` (5 páginas fixas + runtime + assets + SEO + indexação). |
| Contratos que precisam existir | `payload` de `v2_layout_base_configs` (logos/contato/redes/comunicado); `v2_structural_portal_contents` por área; `WidgetContract` (8 métodos) e `WidgetRegistry`; `BasicPage::{getLayoutConfig,getSeoData,syncToSearch}`; `v2_basic_page_assets` sem FK. |
| Critério de saída | Bloco SLE renderiza no portal com `sle_component()`; erro de bloco vira comentário HTML, não 500; LSE renderiza 21 tipos padrão e aceita widget de módulo; `/{slug}` só usa `is_runtime=true`; salvar tema invalida cache das cinco ações de configuração. |
| Paralelizável | Sim, em três frentes: SLE, LSE e BasicPage. BasicPage só entra depois que SEO/Search/Gallery estiverem verdes; LSE depende de CRE/Gallery; SLE depende de SupportConfigs/Gallery. |

Referências: `05_modulos/Support/StructuralLandingEditor/spec.md:1006-1022`;
`03_servicos-ui/landing-sections-editor/spec.md:553-629`;
`05_modulos/Layouts/BasicPage/spec.md:826-845`.

**Ciclo MailService.** O `depende_de` declara
`MOD-SUPPORT-SUPPORTCONFIGS` + `MOD-SUPPORT-STRUCTURALLANDINGEDITOR`
(`02_servicos-base/mail-service.md` front-matter). Por isso E2 entrega só o núcleo
(SMTP/log); `email.default` só fecha depois de SLE. Não mover o serviço inteiro para E6:
Fale Conosco e AssocieSe precisam do núcleo antes.

#### E7 — Domínios

| Subetapa | Unidades | Pré-requisitos | Critério de saída |
|---|---|---|---|
| E7.1 | `MOD-PUBLICACOES-NOTICIAS` + contrato de categoria de `MOD-CONEXOES-UNIDADEREGIONAL` | E1–E5 | 28 rotas de Notícias; CRUD CMS, portal, categorias, tags, galeria ordenada, estados `draft/published/archived/pending_approval`, feed e busca disparados |
| E7.2 | `MOD-CONEXOES-UNIDADEREGIONAL`, `MOD-CONEXOES-ASSOCIADOS`, `MOD-CONEXOES-PARCEIROSINSTITUCIONAIS` | E7.1 | token `asc_` (sha256, TTL 365) e 8 endpoints; escopo regional em Notícias/Associados; tags compartilhadas |
| E7.3 | `MOD-INSTITUCIONAL-HISTORIA`, `-FALECONOSCO`, `-ASSOCIESE`; `MOD-PUBLICACOES-AGENDA`, `-TRABALHECONOSCO` | E6 (SLE/LSE/BasicPage), E7.2 | CRUD CMS + portal; formulários enviam e-mail; Agenda publica feed; Trabalhe Conosco recebe candidatura |
| E7.4 | `MOD-INFRAESTRUTURA-CERTIFICADODIGITAL`, `-GESTAOPERMISSOES`, `-FEEDRSS`, `-MAILAUDIT` | E2 (assinatura/mail), E3, E5, E1 | assinatura de PDF; CRUD de perfis/usuários; painel do feed; histórico de e-mails |
| E7.5 | `MOD-SUPPORT-NOTICIASIMPORT` | E7.1, E7.2, E3 | importação dry-run/apply idempotente, chave interna com escopo/TTL/IP, erros `invalid_dir`/`consumer_mismatch` |

**Ordem interna obrigatória.** Notícias antes de Unidade Regional **completa**, mas o
contrato de categoria (`regional-<sigla>`) precisa existir antes de Notícias. O
`depende_de` das duas unidades é mútuo (`05_modulos/Publicacoes/Noticias/spec.md` e
`05_modulos/Conexoes/UnidadeRegional/spec.md`, front-matter). A quebra é: E7.1 entrega
`v2_news_categories` + `RegionalIdentityService` como contrato; E7.2 entrega CMS/API/portal.

Paralelizável: E7.2 pode rodar em três trilhas (UR, Associados, Parceiros); E7.3 em cinco
trilhas; E7.4 em quatro. E7.5 é sequencial em relação a Notícias.

#### E8 — Composições

| Campo | Conteúdo |
|---|---|
| Pré-requisitos | E7 completo (Notícias, Agenda, Parceiros, Associados, UR, LSE, SLE). |
| Artefatos | `Homepage` (widgets `sucesu-*`, seções, SEO) e `SobreNos` (widgets `sobre-nos-*`, conteúdo, membros, linha do tempo). |
| Contratos que precisam existir | Registro de widgets de módulo no `WidgetRegistry`; payload de seções; IDs de mídia; SEO por página; cache invalidado ao salvar. |
| Critério de saída | Homepage renderiza seções registradas e fallback quando widget ausente; Sobre Nos renderiza depoimentos/equipe; ambos aparecem no sitemap e na busca. |
| Paralelizável | Sim: Homepage e SobreNos são independentes entre si; cada uma depende do mesmo conjunto de contratos. |

Referências: `03_servicos-ui/landing-sections-editor/widgets-e-schemas.md:552-560`;
`05_modulos/Layouts/Homepage/spec.md:622-644`;
`05_modulos/Layouts/BasicPage/spec.md:394-396`.

#### E9 — Dados iniciais de conteúdo

| Campo | Conteúdo |
|---|---|
| Pré-requisitos | E7 e E8 (schemas e contratos de mídia/páginas). |
| Artefatos | 15 seeders: 9 de `V2/Seeds/BasicPages/`, 1 de `V2/Seeds/Content/`, 5 de `V2/Seeds/` (SLE). |
| Contratos que precisam existir | `seedFromPath` de BasicPage/Gallery; `createFromGallery`; payload de SLE; URLs de mídia estáveis; idempotência por chave natural. |
| Critério de saída | `migrate:fresh --seed` duas vezes na mesma base não duplica linhas nem mídia; páginas sombra (`noticias`, `associados`, `convenios`, `agenda`, `fale-conosco`, `parceiros-institucionais`) existem com `is_runtime=true`; homepage semeada tem `content` zerado e runtime removido. |
| Paralelizável | Sim por unidade de seed (BASICPAGES, CONTENT, SLE), respeitando a ordem: SLE assets/configs → BasicPages → Content. |

Referências: `00_inventario/manifest.json` (unidades `DATA-SEEDS-*`);
`05_modulos/Layouts/BasicPage/spec.md:354,394-396`;
`05_modulos/Support/SupportConfigs/dados.md:483`.

### 3. Regra de avanço entre etapas

Uma etapa só é declarada concluída quando:

1. Todos os contratos listados têm teste automatizado (ver `paridade.md` §2).
2. Nenhum consumidor da etapa seguinte precisa de mock temporário.
3. `_indices/rotas.csv`, `tabelas.csv` e `componentes.csv` foram atualizados com o que a
   etapa introduziu (ou o desvio está registrado como lacuna).
4. Os PCs da unidade correspondente passam, **exceto** os PCs que o próprio corpus marca
   como defeito (lista em `paridade.md` §4).

## Particularidades

1. **O nome do diretório é contrato.** Namespace PHP, namespace de view, prefixo de API e
   chave de permissão derivam do nome (`01_arquitetura/01-boot-autodiscovery.md:28`). Uma
   reconstrução que renomeie módulos quebra `v2_can`, sidebar e URLs. A ordem acima assume
   os nomes do legado.
2. **Grupo exibido vem do disco, não do provider.** `getConfig()['group']` é sobrescrito
   pelo diretório (`01_arquitetura/01-boot-autodiscovery.md:39`; `PC-ARCH-02`). Criar o
   grupo antes do módulo não muda a sidebar.
3. **Rotas de serviço não passam pela pilha CMS.** `mapServiceRoutes()` aplica só `web`
   (`01_arquitetura/04-middlewares-seguranca.md:537`). Isso é a causa raiz de SEC-G1-01 e
   é o motivo pelo qual Gallery não pode ser construída “como os módulos”.
4. **Ciclo Notícias ↔ Unidade Regional.** Nenhuma das duas pode ser “a primeira” inteira.
   A fatia de contrato (categoria regional) é pré-requisito de Notícias
   (`01_arquitetura/06-tenancy-regional.md:357`).
5. **Ciclo Media ↔ Gallery.** Media declara Gallery como dependência e Gallery declara
   Media (`03_servicos-ui/media/spec.md` e `03_servicos-ui/gallery/spec.md`,
   front-matter). O contrato `GalleryConfig`/`v2_gallery_media` é a fatia que quebra o
   ciclo.
6. **MailService não é “base pura”.** Depende de SupportConfigs e SLE; a etapa E2 entrega
   apenas o núcleo.
7. **Dashboard não é fundação.** Depende de SEO e Search; construí-lo cedo força stubs que
   escondem a ausência dos índices (`02_servicos-base/dashboard.md:479-487`).
8. **Dados de fundação ≠ seeds de conteúdo.** Os primeiros vêm de migrations no legado e
   são pré-requisito de login/tema/páginas; os segundos são `V2/Seeds/*` e entram em E9.
9. **O que não construir.** Grupos sem implementação (`API`, `AtosOficiais`,
   `Relacionamentos`, `Utilitarios`) existem só como README e não entram na ordem
   (`01_arquitetura/10-grupos-e-modulos-vazios.md:315-320`; `PC-GRP-05`). `_Exemplos` serve
   como prova de autodiscovery (`PC-CORE-BOOT-06`), não como domínio.
10. **Não reproduzir dívidas de construção.** A ordem evita deliberadamente repetir:
    rotas de serviço sem auth; `eval` de bloco; `{!! content !!}` sem sanitização;
    duplo-encode de metadata; `active_pattern` com `|`; TTL em minutos acoplado ao
    framework; `TrustProxies='*'`. Cada item está detalhado em `riscos.md`.

## Integrabilidade

### Receitas de uso

**1. Acrescentar um módulo novo na etapa correta.**

```text
E7: criar V2/Modules/<Grupo>/<Modulo>/{ModuleProvider.php,Routes,Controllers,Models,Views,Migrations}
    → registrar a chave <Modulo> em v2_roles.permissions_v2 e no sidebar
    → emitir PCs próprios e linhas em rotas.csv/tabelas.csv/componentes.csv
```

O provider precisa existir para aparecer no menu; sem provider, as rotas carregam mas o
módulo não aparece (`PC-ARCH-06`, `01_arquitetura/00-visao-geral.md:308`).

**2. Trocar a pilha-alvo sem trocar contratos.**

Preservar: status codes e mensagens literais; nomes de rota; headers de cache; formato de
`ApiResponse`; precedência de SEO; caminhos de storage. Trocar apenas o mecanismo
(framework, ORM, auth) e registrar a decisão em `riscos.md` R-19.

**3. Validar uma etapa antes de liberar a seguinte.**

```bash
# exemplo de gate local por etapa
python3 sucesu_analise/tools/lint_docs.py --strict-citations
python3 sucesu_analise/tools/merge_indices.py --check
git -C sucesu-cms status --porcelain V2   # deve sair vazio
```

## Anti-uso

1. **Construir domínios antes da pilha de auth.** Notícias, Agenda e Associados dependem de
   `CmsAuthenticate` + `V2PermissionMiddleware` + `module.active`. Sem a pilha, cada módulo
   inventa sua própria guarda — foi assim que Gallery nasceu sem auth.
2. **Tratar `08_matriz/singularidades.md` como leitura opcional.** Homepage e SobreNos
   compartilham widgets com LSE/SLE; sem a comparação de responsabilidade, a equipe duplica
   editores (`PLANO.md:372`).
3. **Construir E9 antes de E7/E8.** Os seeders chamam `seedFromPath`, `createFromGallery` e
   payloads de SLE; sem esses contratos, cada seeder vira um script de banco independente.
4. **“Corrigir” a ordem para seguir a árvore de diretórios.** O legado tem dependências
   reversas (Gallery importa models de módulos; Search importa modelos de domínio). A ordem
   acima é por contrato, não por pasta.

## Lacunas

| ID | Lacuna | Impacto | Onde procurar |
|---|---|---|---|
| `LG-REIMPL-01` | `08_matriz/` ainda não publicado no snapshot desta síntese; as referências a `singularidades.md`, `permissoes-e-papeis.md`, `integracoes-e-contratos.md` são destinos, não evidência | a ordem não pôde validar as arestas reversas contra a matriz | `08_matriz/*.md` (Onda 5) |
| `LG-REIMPL-02` | `_indices/dados-iniciais.csv` está vazio (apenas cabeçalho) no snapshot | a ordem de E9 foi derivada do manifest e dos docs de unidade, não do índice | `_indices/dados-iniciais.csv` |
| `LG-REIMPL-03` | `_indices/rotas.csv` tem 277 linhas (243 endpoints, 30 grupos, 2 redirects, 2 rotas) e `PLANO.md` §10 fala em 308 `Route::*` | conciliação de rotas do gate G4 não fecha por contagem | `_indices/rotas.csv`; `PLANO.md:83,321` |
| `LG-REIMPL-04` | 87 migrations para 57 tabelas: a diferença é composta de alters, cópias e backups | a ordem de schema não pode ser “uma migration por tabela” | `01_arquitetura/12-migracoes-inventario.md` |
| `LG-REIMPL-05` | A pilha-alvo da reconstrução não foi decidida neste corpus | os contratos de TTL, auth e sessão precisam de decisão explícita | `riscos.md` R-19 |

## Evidências

- Grafo de dependências: front-matter `depende_de` dos 60+ documentos de unidade; índices
  canônicos `_indices/{rotas,tabelas,componentes,servicos,permissoes,config}.csv`.
- Boot por diretório: `01_arquitetura/01-boot-autodiscovery.md:26-45,87-124,156-162`.
- Pilha e ordem: `01_arquitetura/04-middlewares-seguranca.md:71-109,530-542`.
- Auth/RBAC e PCs: `01_arquitetura/03-auth-rbac-sentinel.md:775-791`.
- Dados/UUID/migrações: `01_arquitetura/05-persistencia-uuid-migracoes.md:412-419`;
  `01_arquitetura/12-migracoes-inventario.md:390-407`.
- Runtime/cache/erros/build: `01_arquitetura/09-cache-csp-minify-maintenance.md:540-551`;
  `01_arquitetura/11-satelites-build-config.md:534-543`.
- Serviços: `02_servicos-base/*.md`, `03_servicos-ui/*/spec.md`.
- Módulos e composições: `05_modulos/**/spec.md`.
- Contagem de unidades e seeds: `00_inventario/manifest.json`; `00_inventario/INVENTARIO.md:60-62`.
