# ADR-003 — Raiz = Laravel típico; `/src` = só domínio; `/wiki` = só documentação

| Campo | Valor |
|---|---|
| **Status** | Aceito (2026-10-16) |
| **Data** | 2026-10-14 |
| **Plano de origem** | `wiki/plan/01-analise-e-decisoes.md` |
| **Relacionadas** | ADR-013, ADR-005 |

## Contexto

A reescrita parte de `prefeituras_v5`, cujo legado misturava domínio, framework e views em
`app/Http/Model`, repositórios sem contrato e views gigantes. O `cms/` (Concordia) provou que
separar o domínio em `/src` com autoload por camada reduz acoplamento. É preciso uma fronteira
física clara entre **framework** e **domínio**, sem brigar com a estrutura padrão do Laravel.

## Decisão

- A raiz de `public-v7/` é um **Laravel 12 típico e enxuto** (framework fora de `/src`).
- Dentro de `/src` existem **somente**: `core/`, `services/`, `layout/`, `modules/`, `tests-e2e/`.
- `DocumentRoot` = `public/` padrão do Laravel. Infra (`docker/`, `docker-compose.yml`,
  `Makefile`) na raiz.
- Toda documentação vive em `/wiki` (`plan/`, `adr/`, `specs/`, `ARQUITETURA.md`).
- O autoload PSR-4 mapeia as 4 camadas para `/src` (`Core\`→`src/core`, etc.).
- O scaffold não usado é removido (`app/Http/Controllers/*`, `resources/views/welcome`,
  migrations default, etc.).

## Justificativa (alternativas descartadas)

- **Domínio em `app/` (padrão Laravel)** — descartada: colide com o ciclo de vida do framework,
  favorece `app/Http/Model` e dificulta a regra de fronteira.
- **Framework dentro de `/src`** — descartada: exige sobrescrever o bootstrap do Laravel e
  aumenta o atrito a cada upgrade.
- **Documentação espalhada** — descartada: o legado perdeu o rastro; centralizar em `/wiki`
  torna spec/ADR/plano consultáveis por humanos e agentes.

## Consequências

**Positivas**
- Fronteira física: o que é framework e o que é domínio fica óbvio.
- `app/` enxuto (só bootstrap); regra verificável por comando.

**Custos / negativas**
- Requer configurar autoload e providers por camada (uma vez).
- Dev precisa saber que domínio **não** mora em `app/`.

## Exemplo mínimo (comparativo)

```php
// ❌ Padrão legado: domínio misturado ao framework
// app/Http/Model/Prefecture/Layout.php
namespace App\Http\Model\Prefecture;

// ✅ Domínio isolado, autoload por camada
// composer.json
"autoload": {
  "psr-4": {
    "Core\\":     "src/core/",
    "Services\\": "src/services/",
    "Layout\\":   "src/layout/",
    "Modules\\":  "src/modules/"
  }
}
// src/modules/Publicacoes/Noticias/Database/Models/Noticia.php
namespace Modules\Noticias\Database\Models;
```

## Verificação

- `git ls-files src | awk -F/ '{print $2}' | sort -u` retorna **exatamente**
  `core services layout modules tests-e2e`.
- `php artisan about` funciona com `app/` contendo só bootstrap.

## Referências

- `cms/specs/Architecture.md`; `wiki/plan/03-esqueleto-ddd-lite.md`.
