---
id: GRP-INDEX
tipo: matriz
onda: 1
status: concluido
unidades: [GRP-API, GRP-ATOSOFICIAIS, GRP-CONEXOES, GRP-INFRAESTRUTURA, GRP-LAYOUTS, GRP-PUBLICACOES, GRP-RELACIONAMENTOS, GRP-SUPPORT, GRP-UTILITARIOS, GRP-_EXEMPLOS]
fontes:
  - V2/Modules/API/README.md
  - V2/Modules/AtosOficiais/README.md
  - V2/Modules/Conexoes/README.md
  - V2/Modules/Infraestrutura/README.md
  - V2/Modules/Infraestrutura/MailAudit/README.md
  - V2/Modules/Layouts/Homepage/README.md
  - V2/Modules/Publicacoes/README.md
  - V2/Modules/Relacionamentos/README.md
  - V2/Modules/Support/README.md
  - V2/Modules/Support/SupportConfigs/README.md
  - V2/Modules/Support/SupportConfigs/Controllers/README.md
  - V2/Modules/Support/SupportConfigs/Services/README.md
  - V2/Modules/Utilitarios/README.md
  - V2/Modules/_Exemplos/README.md
depende_de: [CORE-BOOT, ARCH-OVERVIEW]
consumidores: [MOD-INDEX]
criticidade: media
dono: BootNavigation
---

# Grupos de módulos V2: o que existe, o que é promessa

## 0. Ficha de identidade

| Campo | Valor |
|---|---|
| Efeito primário | O grupo é o diretório de primeiro nível em `V2/Modules`; ele define o bloco do menu lateral, o bloqueio de acesso do grupo `Support` e a ocultação total do grupo `API`. |
| Entrada | Nome do diretório do grupo, injetado em `getConfig()['group']` no boot (`V2/Core/Providers/V2ServiceProvider.php:109`). |
| Saída | Agrupamento e ordenação do menu (`V2/Core/ViewComposers/SidebarComposer.php:72-98`); bloqueio por e-mail para `Support` (`V2/Core/Middleware/V2PermissionMiddleware.php:50-67`). |
| Efeitos colaterais | Módulo de grupo inexistente/renomeado muda de bloco sem edição de código; módulo `API` pode ficar inacessível pela sidebar mas continuar alcançável por URL. |
| Particularidade central | Quatro grupos existem apenas como README: `API`, `AtosOficiais`, `Relacionamentos`, `Utilitarios`. Nenhum tem módulo, rota ou migration. |
| Como se integra | Criar `V2/Modules/<Grupo>/<Modulo>/`; o grupo passa a existir. O README não é lido pelo runtime. |
| Se removido, quebra | A pasta do grupo some do menu e o módulo perde a chave de permissão se o nome do diretório mudar. |
| Superfície pública | Nenhuma classe; contrato é o nome do diretório + `ModuleProvider::getConfig()`. |

## 1. Efeito

### 1.1 Estado real dos grupos

| Grupo (GRP) | README? | Módulos implementados (diretório) | Estado | Evidência |
|---|---|---|---|---|
| `API` | Sim (`V2/Modules/API/README.md`) | **nenhum** | **não implementado** | `ls V2/Modules/API` → apenas `README.md` |
| `AtosOficiais` | Sim | **nenhum** | **não implementado** | `V2/Modules/AtosOficiais/README.md:1-7` |
| `Conexoes` | Sim | `Associados`, `ParceirosInstitucionais`, `UnidadeRegional` | implementado | `V2/Modules/Conexoes/{Associados,ParceirosInstitucionais,UnidadeRegional}/ModuleProvider.php` |
| `Infraestrutura` | Sim + README de `MailAudit` | `CertificadoDigital`, `FeedRss`, `GestaoPermissoes`, `MailAudit` | implementado | `V2/Modules/Infraestrutura/*/ModuleProvider.php` |
| `Institucional` | **não** (sem unidade GRP) | `AssocieSe`, `FaleConosco`, `Historia`, `SobreNos` | implementado | diretórios sob `V2/Modules/Institucional/` |
| `Layouts` | **não** (só `Homepage/README.md`) | `BasicPage`, `Homepage` | implementado | `V2/Modules/Layouts/*/ModuleProvider.php` |
| `Publicacoes` | Sim | `Agenda`, `Noticias`, `TrabalheConosco` | implementado | `V2/Modules/Publicacoes/*/ModuleProvider.php` |
| `Relacionamentos` | Sim | **nenhum** | **não implementado** | `V2/Modules/Relacionamentos/README.md:1-7` |
| `Support` | Sim + 3 READMEs de `SupportConfigs` | `NoticiasImport`, `StructuralLandingEditor`, `SupportConfigs` | implementado, doc parcialmente obsoleta | `V2/Modules/Support/*/ModuleProvider.php` |
| `Utilitarios` | Sim | **nenhum** | **não implementado** | `V2/Modules/Utilitarios/README.md:1-7` |
| `_Exemplos` | Sim | `ExemploAPI` | implementado, restrito | `V2/Modules/_Exemplos/README.md:8-19` |

O grupo `Institucional` não tem unidade `GRP-*` no manifest porque nenhum README de grupo existe para ele; os quatro módulos têm docs próprios (`MOD-INSTITUCIONAL-*`). `Layouts` tem README apenas do módulo `Homepage`, que o manifest atribui a `GRP-LAYOUTS` — não é um README de grupo.

### 1.2 O que o README promete versus o que existe

| Grupo | Promessa literal do README | Implementação encontrada | Classificação |
|---|---|---|---|
| API | "expor rotas de API pública ou privada, integrações externas e webhooks ... sem interface própria"; "**Exemplo de módulo:** `Exemplo` (módulo modelo de API)" (`V2/Modules/API/README.md:4-9`) | Nenhum módulo; nenhuma rota `api/v2/*` de grupo; o diretório `API/Exemplo` não existe | **não implementado**; referência morta |
| AtosOficiais | "publicação e arquivamento de documentos oficiais, diários oficiais, resoluções, licitações, contratos, portarias, decretos e legislações"; "controle de numeração, datas de publicação e anexos em formato PDF" (`V2/Modules/AtosOficiais/README.md:4-7`) | Nenhum módulo, nenhuma tabela, nenhuma rota | **não implementado** |
| Relacionamentos | "ouvidorias, formulários de contato, pesquisas de satisfação e canais de atendimento"; "formulários, sistemas de tickets, pesquisas e ouvidoria" (`V2/Modules/Relacionamentos/README.md:4-7`) | Nenhum módulo. O único formulário de contato existente é `Institucional/FaleConosco` (`V2/Modules/Institucional/FaleConosco/ModuleProvider.php:19-24`) | **não implementado**; a funcionalidade citada vive em outro grupo |
| Utilitarios | "geradores de QR Code, ferramentas de exportação/importação genéricas, encurtadores de link, gerenciador de contatos e emails de ajuda" (`V2/Modules/Utilitarios/README.md:4-7`) | Nenhum módulo. Existem serviços (`V2/Services/ExcelImporter/`) e o módulo `Support/NoticiasImport`, mas nada sob `Utilitarios` | **não implementado** |
| Support | "módulos de manutenção, auditoria profunda do banco ... parametrização geral"; "Módulo atual: `SupportConfigs`" (`V2/Modules/Support/README.md:7-9`) | 3 módulos: `NoticiasImport`, `StructuralLandingEditor`, `SupportConfigs` | implementado; README desatualizado (não cita 2 dos 3) |
| Infraestrutura | "Módulo atual: `Infraestrutura` (Módulo para controle de permissões, usuários e perfis)" (`V2/Modules/Infraestrutura/README.md:9`) | 4 módulos, e **não existe** um módulo chamado `Infraestrutura`; o controle de permissões é `GestaoPermissoes` | implementado; README incorreto |
| Conexoes | "cadastramento, portais internos e controle de API para conectados"; "Módulos administrativos B2B" (`V2/Modules/Conexoes/README.md:4-8`) | 3 módulos: `Associados`, `ParceirosInstitucionais`, `UnidadeRegional` | implementado |
| Publicacoes | "notícias, comunicados, avisos ... categorias ... tags e álbuns" (`V2/Modules/Publicacoes/README.md:4-7`) | `Agenda`, `Noticias`, `TrabalheConosco`; categorias/tags/álbuns vivem dentro de `Noticias` e serviços | implementado |
| Layouts | `Homepage/README.md` documenta homepage composta por LSE, 9 widgets, integrador de dados (`V2/Modules/Layouts/Homepage/README.md:3-32`) | `Homepage` e `BasicPage`; 9 widgets em `LseWidgets/` | implementado; README de módulo, não de grupo |
| _Exemplos | "Todos os submódulos em `_Exemplos` são **restritos exclusivamente** ao usuário `suporte@maxima.inf.br`, independentemente do perfil V2" (`V2/Modules/_Exemplos/README.md:16-19`) | `ExemploAPI` restrito por `restricted` + controller; **super-admin também passa** | implementado; promessa mais restritiva que o código |

## 2. Abordagem

### 2.1 Como o grupo vira comportamento

```mermaid
flowchart LR
  D[diretório V2/Modules/Grupo] --> P[V2ServiceProvider: group = basename]
  P --> M[moduleConfigs: nome => config + group]
  M --> S[SidebarComposer]
  M --> V[V2PermissionMiddleware]
  S -->|API| H[remove do menu]
  S -->|SUPPORT fora do e-mail| H2[remove do menu]
  V -->|SUPPORT fora do e-mail| B[403 ou redirect]
```

1. O provider varre os grupos e injeta `group` no config do módulo (`V2/Core/Providers/V2ServiceProvider.php:109`).
2. O mapa completo é publicado em `v2.modules.configs` (`:133`).
3. `SidebarComposer` remove `API`, remove `SUPPORT` para não-suporte, aplica `restricted` e RBAC, agrupa por `group`, ordena módulos por `title` e grupos por nome (`V2/Core/ViewComposers/SidebarComposer.php:24-98`).
4. `V2PermissionMiddleware` bloqueia requisições do grupo `SUPPORT` para não-suporte, com log warning e redirect/403 (`V2/Core/Middleware/V2PermissionMiddleware.php:50-67`).

### 2.2 Trechos de código pivô

```php
// V2/Core/Providers/V2ServiceProvider.php:103-110 — o grupo é o diretório, não o código.
$providerClass = "V2\\Modules\\{$groupName}\\{$moduleName}\\ModuleProvider";
if (class_exists($providerClass)) {
    $provider = new $providerClass();
    if ($provider instanceof \V2\Core\Contracts\ModuleProviderInterface) {
        $config = $provider->getConfig();
        // Injeta dinamicamente o grupo baseado no diretório físico (ex: API, Support, Layouts)
        $config['group'] = $groupName;
        $moduleConfigs[$moduleName] = $config;
```

Um `ModuleProvider` não pode “escolher” seu grupo; mover a pasta é a única forma de mudar o bloco do menu.

```php
// V2/Core/ViewComposers/SidebarComposer.php:36-48 — API some; SUPPORT é restrito ao e-mail.
// 1. Módulos do grupo API não devem ser indexados na Sidebar
if (strtoupper($group) === 'API') {
    unset($moduleConfigs[$moduleName]);
    continue;
}

// 2. Módulos do grupo Support são visíveis exclusivamente para o e-mail de suporte (config/v2.php)
if (strtoupper($group) === 'SUPPORT') {
    if ($user->email !== config('v2.support.email')) {
        unset($moduleConfigs[$moduleName]);
        continue;
    }
}
```

A comparação é `strtoupper`, então `Support`, `SUPPORT` e `support` são equivalentes — mas o diretório `Support` é o que existe (`V2/Modules/Support`).

```php
// V2/Core/ViewComposers/SidebarComposer.php:85-98 — ordenação e achatamento.
foreach ($groupedMenu as $group => &$modules) {
    usort($modules, function($a, $b) {
        return strcasecmp($a['title'] ?? '', $b['title'] ?? '');
    });
}

uksort($groupedMenu, 'strcasecmp');

$groupedMenu = $this->flattenSingleSubmodules($groupedMenu);
```

Os grupos aparecem em ordem alfabética independentemente da “posição” declarada no `ModuleProvider`; `position` não é usada na sidebar.

```php
// V2/Core/Middleware/V2PermissionMiddleware.php:50-66 — bloqueio efetivo do grupo Support.
if ($matched && isset($currentModuleConfig['group']) && strtoupper($currentModuleConfig['group']) === 'SUPPORT') {
    if ($user->email !== config('v2.support.email')) {
        Log::warning(sprintf(
            '[V2 > MIDDLEWARE > Permission] Acesso negado ao grupo restrito Support para o usuário %s no módulo %s (%s).',
            $user->email, $currentModuleKey, $request->fullUrl()
        ));

        if ($request->ajax() || $request->wantsJson()) {
            return response('Forbidden. Support area is restricted.', 403);
        }

        return redirect()->route('v2.cms.dashboard')
            ->with('error', 'Acesso negado. Esta área é restrita ao suporte técnico autorizado.');
```

O bloqueio depende de o módulo ter sido **casado** por `active_pattern`; um módulo Support com `active_pattern` errado não é bloqueado por grupo.

```php
// V2/Modules/_Exemplos/ExemploAPI/ModuleProvider.php:26-29 — restrição individual.
'position' => 1,
'active_pattern' => 'cms/exemplo-api*',
// Apenas o e-mail de suporte enxerga no sidebar — ver SidebarComposer + config/v2.php
'restricted' => config('v2.support.email'),
```

A chave `restricted` é avaliada em `SidebarComposer.php:51-57`; o super-admin também passa, contrariando o “independentemente do perfil” do README de `_Exemplos`.

### 2.3 Regra de grupo Support/API na sidebar (resumo normativo)

| Grupo | Sidebar | Middleware | RBAC por módulo | Consequência |
|---|---|---|---|---|
| `API` | Sempre removido (`SidebarComposer.php:37-40`) | Nenhum bloqueio por grupo | Sim, se casar `active_pattern` | Módulo API pode ser acessado por URL direta se registrar rota CMS; só o menu o esconde. |
| `SUPPORT` | Só e-mail `config('v2.support.email')` (`:43-48`) | Bloqueio por grupo com 403/redirect (`V2PermissionMiddleware.php:51-67`) | Sim, para quem passou pelo grupo | Duas camadas para esconder, uma para proteger. |
| Demais | Visível se permissão ≠ `none` (`:59-66`) | Sem regra de grupo | Sim | Módulo sem permissão desaparece. |
| `_Exemplos` | Removido se `restricted` não casar (`:51-57`) | Sem regra de grupo | Sim | Super-admin e suporte veem. |

### 2.4 Decisões e restrições

- **Grupo é físico** (`:109`), não configurável; não há tabela de grupos.
- **`API` é tratado só na apresentação**, não no middleware; a expectativa é que módulos API não tenham interface CMS (README `API/README.md:8`).
- **`Support` é tratado em duas camadas independentes** (menu e middleware), o que gera duplicação de `config('v2.support.email')`.
- **READMEs de grupo não são lidos pelo runtime**; nenhuma promessa de grupo vira comportamento sem código.

## 3. Particularidades

### 3.1 O que só existe aqui

- **Grupos vazios com README** são quatro: `API`, `AtosOficiais`, `Relacionamentos`, `Utilitarios`. Eles aparecem no filesystem e são varridos no boot, mas não geram menu, rota ou tabela.
- **`Institucional` sem README de grupo** e **`Layouts` com README de módulo**: a documentação de grupos é incompleta em 2 de 11 diretórios.
- **README de `SupportConfigs` obsoleto**: cita `UserConfigsCmsController` e `UserConfigsService` dentro de `SupportConfigs`, mas ambos estão em `Support/StructuralLandingEditor` (`V2/Modules/Support/StructuralLandingEditor/Controllers/UserConfigsCmsController.php:3`), e os namespaces documentados `V2\Modules\SupportConfigs\...` não existem — o real é `V2\Modules\Support\SupportConfigs\...` (`.../SupportConfigs/Controllers/SupportConfigsCmsController.php:3`).
- **`SupportConfigs/Controllers/README.md` documenta namespace `V2\Modules\SupportConfigs\Controllers`**; a classe real está em `V2\Modules\Support\SupportConfigs\Controllers` e possui `index()` e `clearCache()` (`SupportConfigsCmsController.php:59,81`).
- **`Infraestrutura` tem um módulo `FeedRss` que também é serviço** (`V2/Services/FeedRSS`), com nomes de diretório diferindo apenas em caixa.

### 3.2 Invariantes

| ID | Regra | Efeito | Fonte |
|---|---|---|---|
| RN-GRP-01 | `group` = `basename` do diretório do grupo. | Mover módulo muda grupo/menu/bloqueio. | `V2ServiceProvider.php:109` |
| RN-GRP-02 | `API` nunca aparece na sidebar. | Módulos API não têm entrada de menu. | `SidebarComposer.php:37-40` |
| RN-GRP-03 | `SUPPORT` só aparece/protege para `config('v2.support.email')`. | Outros usuários não veem nem acessam. | `SidebarComposer.php:43-48`; `V2PermissionMiddleware.php:51-67` |
| RN-GRP-04 | `restricted` aceita super-admin. | `_Exemplos` visível a super-admin, apesar do README. | `SidebarComposer.php:53` |
| RN-GRP-05 | Grupo sem módulo é inerte. | README não gera comportamento. | `V2ServiceProvider.php:96-130` |
| RN-GRP-06 | Nome duplicado de módulo entre grupos colide. | Última varredura sobrescreve o menu; o primeiro path de view vence. | `V2ServiceProvider.php:110,123` |

### 3.3 Casos-limite

- **Módulo Support sem `active_pattern` válido**: `$matched` fica falso, o bloqueio de grupo não roda e o módulo cai em “fora de módulo → permite acesso básico” (`V2PermissionMiddleware.php:74-77`). [C]
- **Módulo API com rota CMS**: o middleware não bloqueia por grupo; qualquer usuário com papel Sentinel chega à rota se não houver `CmsAuthenticate` + RBAC. [I] decorre de `V2PermissionMiddleware.php:51` só tratar `SUPPORT`.
- **Diretório de grupo em minúsculas** (`support`): `strtoupper` normaliza a comparação na sidebar e no middleware, mas `ModuleProvider` resolvido por `V2\Modules\support\...` quebraria o autoload PSR-4 (case-sensitive no Linux). [I]
- **`_Exemplos` sem `restricted`**: cairia como grupo comum e apareceria para qualquer usuário com permissão. O README instrui removê-lo ao copiar (`V2/Modules/_Exemplos/README.md:26`).
- **Sidebar com usuário nulo**: menu vazio (`SidebarComposer.php:68-70`).

### 3.4 Armadilhas de reimplementação

1. **Tratar `API` como grupo protegido**: hoje só é oculto; criar módulo API com rota CMS é um risco real.
2. **Ler os READMEs como especificação**: quatro grupos são promessa, e os READMEs de `Infraestrutura` e `SupportConfigs` descrevem arquivos que não existem onde dizem.
3. **Usar `position` do `ModuleProvider` para ordenar grupos**: a sidebar ignora `position` e ordena por `strcasecmp` de `title`/nome do grupo.
4. **Assumir que `_Exemplos` é invisível para super-admin**: não é (`SidebarComposer.php:53`).

### 3.5 Divergências documentação × código

| Documento | Diz | Código |
|---|---|---|
| `API/README.md:9` | módulo exemplo `Exemplo` existe | Não existe (`V2/Modules/API/` só tem README) |
| `Support/README.md:8` | bloqueio via `V2PermissionMiddleware` | Confirmado, mas só quando `active_pattern` casa |
| `Support/README.md:9` | "Módulo atual: `SupportConfigs`" | Existem também `NoticiasImport` e `StructuralLandingEditor` |
| `Infraestrutura/README.md:9` | módulo `Infraestrutura` | Não existe; existem 4 módulos com outros nomes |
| `_Exemplos/README.md:18-19` | restrito "independentemente do perfil" | Super-admin passa (`SidebarComposer.php:53`; `ExemploAPICmsController.php:43`) |
| `SupportConfigs/README.md:15-16,23-24` | `UserConfigsCmsController`/`UserConfigsService` em `SupportConfigs` | Estão em `Support/StructuralLandingEditor` |

## 4. Integrabilidade

### 4.1 Como um grupo passa a existir

1. Criar `V2/Modules/MeuGrupo/` (não precisa de README).
2. Criar `V2/Modules/MeuGrupo/MeuModulo/ModuleProvider.php`.
3. O grupo aparece no menu no próximo boot, ordenado alfabeticamente por nome do diretório.
4. Nada em `config/` ou banco precisa mudar.

### 4.2 Receitas de uso

**Módulo no grupo Support** (restrito):

```php
return [
    'title' => 'Ferramenta Interna',
    'active_pattern' => 'cms/ferramenta*',  // necessário para o bloqueio por grupo casar
    'restricted' => config('v2.support.email'),
    'subModulesLevel1' => [/* ... */],
];
```

Colocar em `V2/Modules/Support/Ferramenta/`. Resultado: menu oculto e acesso bloqueado para quem não é `suporte@maxima.inf.br`.

**Módulo no grupo API**:

```text
V2/Modules/API/WebhookParceiro/
├── ModuleProvider.php          # aparece no mapa, mas nunca na sidebar
└── Routes/api.php              # vira /api/v2/webhookparceiro/*
```

Resultado: sem entrada de menu; a API responde sob `api/v2/webhookparceiro`.

### 4.3 Anti-uso

1. **Criar módulo em `API` esperando menu** — nunca aparece (`SidebarComposer.php:37-40`).
2. **Criar módulo em `Support` sem `active_pattern`** — não é bloqueado pelo middleware de grupo, embora continue oculto no menu.
3. **Contar com README de grupo para documentar comportamento** — nenhum README é carregado; grupos vazios não têm efeito.

## 5. Inventário

| Arquivo | Grupo | Papel | Efeito | Fonte |
|---|---|---|---|---|
| `V2/Modules/API/README.md` | API | Promessa | Nenhum módulo; menu sempre oculto | `:1-9` |
| `V2/Modules/AtosOficiais/README.md` | AtosOficiais | Promessa | Nenhum módulo | `:1-7` |
| `V2/Modules/Conexoes/README.md` | Conexoes | Contexto | 3 módulos | `:1-8` |
| `V2/Modules/Infraestrutura/README.md` | Infraestrutura | Contexto | 4 módulos; README incorreto | `:1-9` |
| `V2/Modules/Infraestrutura/MailAudit/README.md` | Infraestrutura | Doc de módulo | Rotas `GET /cms/mail-audit`, `/detail/{id}` | `:24-28` |
| `V2/Modules/Layouts/Homepage/README.md` | Layouts | Doc de módulo | Homepage via LSE | `:1-58` |
| `V2/Modules/Publicacoes/README.md` | Publicacoes | Contexto | 3 módulos | `:1-7` |
| `V2/Modules/Relacionamentos/README.md` | Relacionamentos | Promessa | Nenhum módulo | `:1-7` |
| `V2/Modules/Support/README.md` | Support | Contexto | 3 módulos | `:1-9` |
| `V2/Modules/Support/SupportConfigs/README.md` | Support | Doc de módulo | Estrutura/rotas descritas parcialmente obsoletas | `:1-108` |
| `V2/Modules/Support/SupportConfigs/Controllers/README.md` | Support | Doc de controllers | Namespace documentado divergente do real | `:1-23` |
| `V2/Modules/Support/SupportConfigs/Services/README.md` | Support | Doc de serviços | `UserConfigsService` está em outro módulo | `:1-41` |
| `V2/Modules/Utilitarios/README.md` | Utilitarios | Promessa | Nenhum módulo | `:1-7` |
| `V2/Modules/_Exemplos/README.md` | _Exemplos | Contexto | 1 módulo restrito | `:1-27` |

## 6. Riscos de reimplementação

1. **Quatro grupos vazios** não precisam de implementação para paridade funcional; criar telas neles seria inventar escopo.
2. **Exposição de rotas CMS de módulos API** caso existam no futuro; decidir se a reimplementação replica a ausência de bloqueio por grupo.
3. **`strtoupper` do grupo** deve ser preservado para tolerância a caixa.
4. **READMEs enganosos** (`SupportConfigs`, `Infraestrutura`, `API`) podem induzir a criar arquivos inexistentes.
5. **`Institucional` sem README**: a reimplementação não deve inferir um grupo documentado onde não há.

## 7. Lacunas

- **LG-GRP-01** — Não foi possível confirmar se o grupo `API` já teve módulos removidos; não há histórico no código. Onde procurar: `git log -- V2/Modules/API`.
- **LG-GRP-02** — `SupportConfigs/README.md` descreve `Views/cms/supportConfigs` e `Views/cms/userConfigs` com 10 arquivos listados; não foi feita a conferência arquivo a arquivo neste documento (pertence a `MOD-SUPPORT-SUPPORTCONFIGS`).
- **LG-GRP-03** — Não se sabe se grupos vazios são intencionais (roadmap) ou resíduo; nenhum arquivo de plano dentro de `V2` os referencia.

## 8. Checklist de paridade

- [ ] `PC-GRP-01` — Grupo `API` com um módulo deve continuar invisível na sidebar. Fonte: `SidebarComposer.php:37-40`.
- [ ] `PC-GRP-02` — Usuário comum não deve ver nem acessar `Support`; acesso direto deve redirecionar ao dashboard com `Acesso negado. Esta área é restrita ao suporte técnico autorizado.` Fonte: `V2PermissionMiddleware.php:64-65`.
- [ ] `PC-GRP-03` — `super-admin` deve ver módulo com `restricted`. Fonte: `SidebarComposer.php:53`.
- [ ] `PC-GRP-04` — Criar `V2/Modules/NovoGrupo/ModuloX/ModuleProvider.php` deve fazer o grupo aparecer sem outra configuração. Fonte: `V2ServiceProvider.php:92-110`.
- [ ] `PC-GRP-05` — Nenhum diretório sob `API`, `AtosOficiais`, `Relacionamentos`, `Utilitarios` além do README. Fonte: filesystem.
- [ ] `PC-GRP-06` — Grupos ordenados alfabeticamente na sidebar. Fonte: `SidebarComposer.php:93`.

## 9. Evidências consultadas

- `V2/Modules/API/README.md`; `AtosOficiais/README.md`; `Conexoes/README.md`; `Infraestrutura/README.md`; `Infraestrutura/MailAudit/README.md`; `Layouts/Homepage/README.md`; `Publicacoes/README.md`; `Relacionamentos/README.md`; `Support/README.md`; `Support/SupportConfigs/{README.md,Controllers/README.md,Services/README.md}`; `Utilitarios/README.md`; `_Exemplos/README.md`
- `V2/Core/Providers/V2ServiceProvider.php:92-142`
- `V2/Core/ViewComposers/SidebarComposer.php:20-101`
- `V2/Core/Middleware/V2PermissionMiddleware.php:22-99`
- `V2/Modules/*/*/ModuleProvider.php` (20 arquivos)
- `V2/Modules/Support/SupportConfigs/Controllers/SupportConfigsCmsController.php:1-12`
- `V2/Modules/Support/StructuralLandingEditor/Controllers/UserConfigsCmsController.php:1-12`
- `V2/Modules/_Exemplos/ExemploAPI/ModuleProvider.php:20-40`
