# Módulo Blueprint (`Exemplos/Blueprint`)

> Contrato de leitura do módulo-exemplo canônico (ADR-004/ADR-014). Ele prova a arquitetura de
> ponta a ponta: provider único, rota por convenção, Action com telemetria, migration idempotente
> e view no shell do portal.

## Propósito

- **Grupo:** `Exemplos` (organizacional — não entra no token).
- **Áreas:** portal.
- **Token:** `blueprint`.
- **Ativação:** dado em `core_module_discovery_settings` (ADR-034):
  `php artisan core:module:activate Blueprint [--disable]`.

## Estrutura (contrato físico)

```
src/modules/Exemplos/Blueprint/
├── ModuleProvider.php
├── Database/Migrations/       # exemplos_blueprint_items (uuidv7/jsonb; down()->backup_*)
├── Database/Models/           # BlueprintItem
├── Logic/Actions/             # BlueprintSaudacaoAction (span + log_event)
├── Logic/Controllers/         # BlueprintPortalController (invocável)
├── Routes/portal.php
├── Layout/Views/              # blueprint::blueprint-portal-index
├── Lang/{pt_BR,en,es,fr}/     # index/menu
└── Test/BlueprintTest.php
```

## Rotas

| Nome | Método | URI | Controller | Acesso |
|---|---|---|---|---|
| `portal.blueprint.index` | GET | `/blueprint` | `BlueprintPortalController` | pública |

## Permissões (ADR-033)

Declara `Permission::VIEW` no `ModuleProvider::config()` (`blueprint.ver`); a rota pública não exige
autenticação.

## Eventos e observabilidade (ADR-024/ADR-035)

- **Emite:** `blueprint.saudacao` via `log_event('blueprint.saudacao', …)` e span de mesmo nome em
  `BlueprintSaudacaoAction`; atributos `scalar|null`, sem PII.

## Layout (ADR-016)

- A view usa um único `<x-layout::portal>` e ocupa apenas a área central (`<main>`).

## Comandos

```bash
php artisan core:module:activate Blueprint
php artisan core:module:activate Blueprint --disable
php artisan migrate
```

## Verificação

```bash
make check
make check E2E=1
bash tools/name-check.sh --grep blueprint
```
