# F0 — Importação e redução do Concordia

> **Épico:** `F0` · **Depende de:** — · **Habilita:** F1
> **Fonte:** `../cms/` (Concordia, já estabilizado) · **ADRs:** ADR-001, ADR-002, ADR-003,
> ADR-007, ADR-009, ADR-013, ADR-017, ADR-024

## Objetivo

Aproveitar o **código estabilizado do Concordia** como ponto de partida, **copiando tudo** e, em
seguida, **removendo o específico, polindo e reduzindo o framework** até convergir com os ADRs —
**antes** de escrever implementação nova. Nada de reescrever do zero o que já funciona.

## Escopo do que vem do Concordia

| Vem (base) | Ação |
|---|---|
| `core/` (discovery, messaging, audit, generators/stubs, helpers) | **Transpor** para `src/core`; reduzir |
| `layouts/` (Cms, Portal, Super, Engine/presets) | **Transpor** para `src/layout`; reduzir |
| `services/` (Media, SEO, Security) | **Transpor** para `src/services`; reduzir |
| `modules/` (Blueprint, Noticias, Demo) | **Transpor**; `Demo`→ exemplo, `Blueprint`→ stub |
| `config/`, `bootstrap/`, `routes/` | **Adaptar** ao Laravel 12 (bootstrap/app.php) |
| `containers/` (10) | **Reduzir** aos 6 do ADR-005 (web/php-fpm/queue/postgres/valkey/**storage-RustFS**) |

## Manifest de importação (F0.I1.T2)

- **Fonte:** `../cms/` (Concordia) · **commit** `15b68f3dd5e3c36f418e405ab187817d04c9aa53` (branch `v2`, 2026-10-07)
- **Snapshot:** `.import/concordia/` — git-ignored, `rsync -a --exclude .git,vendor,node_modules` (idempotente)
- **Total:** **648 arquivos · 222 PHP · 7,6 M**

| Top-level | Arq. | Tam. | Destino / ação |
|---|---:|---:|---|
| `core/` | 127 | 540K | `src/core` (`Core\`) — transpor |
| `layouts/` | 61 | 280K | `src/layout` (`Layout\`) — transpor |
| `services/` | 32 | 156K | `src/services` (`Services\`) — transpor |
| `modules/` | 43 | 212K | `src/modules` (`Modules\`) — transpor |
| `config/` | 16 | 100K | adaptar ao Laravel 12 |
| `bootstrap/` | 3 | 12K | adaptar a `bootstrap/app.php` |
| `database/` | 7 | 28K | → `database/migrations` |
| `stubs/` | 9 | 36K | → `stubs/` (generators) |
| `tests/` | 6 | 28K | → `tests/` |
| `containers/` | 49 | 232K | reduzir a **5** (ADR-005) |
| `public/` | 41 | 4,3M | assets → `public/` (reavaliar vendorização) |
| `specs/` `steps/` `wiki/` `.agents/` | 215 | 552K | **remover** (nossa fonte é `wiki/`) — F0.I2.T2 |
| `resources/` `storage/` | 12 | 48K | adaptar |
| raiz (`composer.json`, `Makefile`, `phpstan.neon`, `vite.config.js`, `docker-compose.yml`…) | — | — | reescrever conforme ADRs |

### Camadas mapeadas

- `core/`: `Area/{Api,Cms,Parceiros,Portal,Super,Webhook}` · `Internal/{ModuleDiscovery,Routing,Generators,Audit,Http,Exceptions,System}` · `Messaging/{Events,Models,Database}` · `Shared/Outputs` · `Enums` · `Stub/{Layout,Module,Service}`
- `layouts/`: `Portal/{base-struct,header,main-section,footer,metadata,print,errors}` · `Cms/views` · `Super/views` · `Engine` (presets)
- `services/`: `Media/{Contracts,Optimizers,Storage,View,Enums}` · `SEO/{Actions,DTOs,Models,Routes,Console,Http,View}` · `Security/{Encryption,Hashing,StreamEncryption}`
- `modules/`: `Noticias/{Logic,Layout,Layouts,Database,Routes}` · `Demo/{Logic,Layouts,Database}` · `Blueprint/{Logic,Layouts,Routes}`

### Alvos de remoção (arquivos que citam o marcador)

| Marcador | Arq. | Onde |
|---|---:|---|
| `Parceiros` | 5 | `core/Area/Parceiros` (específico do cliente) |
| `Webhook` | 4 | `core/Area/Webhook` (específico) |
| `Result<` | 13 | `core/Shared/Outputs`, `core/Messaging` |
| `trait` / `abstract class` | 2 / 2 | `core`, `services` |
| `@template` | 1 | `core` |
| `Filament` / `Livewire` / `livewire` | 36 / 23 / 22 | CMS, layouts, config (TipTap → ADR-028) |
| `bootstrap` / `jQuery` | 10 / 4 | views/assets |

- Containers a descartar: `balancer, loki, tempo, observability, telemetry, developer, tools`.
- Configs a remover: `filament.php`, `livewire.php`, `purifier.php`.
- Dependências a remover: `filament/filament`, `google/apiclient`, `league/flysystem-aws-s3-v3`, `mews/purifier`, `predis`. Rever: `spatie/laravel-csp`, `spatie/laravel-medialibrary`, `open-telemetry/sdk`. **Adicionar:** TipTap (npm, ADR-028).

### Removido (F0.I2.T1)

- `Area/Parceiros` + `Internal/Area/Parceiros` e `Area/Webhook` + `Internal/Area/Webhook` — **removidos**.
- `Area/Super` + `Internal/Area/Super` — **removidos** (painel multi-tenant; V7 é **single-tenant** — ADR-003/ADR-005).
- `PlatformArea` reduzido a `PORTAL | CMS | API`; `AreaRegistrar`, `CoreServiceProvider`,
  `CoreDatabaseSeeder`, `helpers.php` (`portal_theme`) e `services/SEO` sem dependência de
  `Tenant`/`Super`.
- Caminhos `base_path('core|modules|services')` → `base_path('src/...')`.
- Verificação: **0** referências pendentes a `Area\Super`/`Parceiros`/`Webhook` ou `::SUPER|PARTNERS|WEBHOOK`.

### Removido / preservado (F0.I2.T3)

- **Removido:** `Services\Security\StreamEncryptionService` (crypto-shredding) e o uso de
  `ShreddableCast` (classe inexistente no `src`); `SecureMediaStorage` simplificado (sem cifra de
  stream); `SecurityServiceProvider`/`MediaStorageInterface` ajustados.
- **Preservado:** **BLAKE3** (`blake3()`, `HashingService`, `AuditService`, UI de auditoria) — é
  essencial (ADR-029); extensão PHP `blake3` será pinada no runtime (plano 04).
- **Preservado:** **IndexNow** — adotado pelo ADR-027.
- **Backlog:** `wiki/backlog/cripto-auditoria-avancada.md` (YARA/WORM/crypto-shredding, se um dia
  necessário).
- **Ausentes no `src`:** YARA/WORM, Loki/Tempo/Vector, sonar (existiam só em `containers/`/docs do
  Concordia, não transpostos). Doc `WORM_STORAGE.md` removido do `src` (track no backlog).

### Removido (F0.I3.T1)

- **`Result<T>` eliminado** (ADR-001): removidos `Core\Shared\Outputs\Result` e o DTO
  `ProblemDetails` (só o `Result` os usava) → `src/core/Shared/` deixou de existir.
- **Erros agora** lançam `ProblemDetailsException` (RFC 7807, ADR-024); sucesso é **retorno concreto**.
- Contratos de mídia (`ImageOptimizerInterface`, `PDFOptimizerInterface`, `MediaStorageInterface`)
  retornam valores/`StreamedResponse`; implementações lançam `ProblemDetailsException`.
- Ajustados: `EncryptionService`, `GenerateSEOMetadata`, `ProcessNoticiaCoverMedia`,
  `ProcessMilestoneMedia` (removido em F5.I3.T4 — código morto; storage só no service Media),
  `DemoResource`; stubs `Action.stub`/`Controller.stub`.
- `CoreTestCase` deixou de ser `abstract`; genéricos (`@template`) removidos.
- **Verificação:** 0 `Result`/`trait`/`abstract`/`@template` em `src`; `php -l` (**php:8.4-cli**) em
  **171 arquivos — 0 erros**.

### Removido (F0.I3.T2)

- **Filament:** `core/Internal/Area/Cms` (PanelProvider+Test), `core/Area/Cms/Pages`,
  `modules/*/Layouts/Cms` (Resources/Pages/Clusters), `core/Stub/Module/Layouts` e stubs de rota
  `super/partners/webhook`.
- **Shells:** `layout/Cms` (base Filament) e `layout/Super` (área removida) — o shell CMS
  Blade/Tailwind/daisyUI é reposto em **F0.I3.T5**; `LayoutServiceProvider` sem `cms::`/`cms-base-layout`.
- **Livewire:** `User` sem `FilamentUser`; `MinifyHtml` sem caso Livewire; ouvintes
  `livewire:navigated` removidos dos blades do Portal.
- **Geradores/stubs:** `MakeModuleCommand`/stubs/READMEs migrados para Blade+Tailwind; placeholders
  mortos (`module_kebab`, `resource_slug`) removidos; `getModuleConfig` sem rotas `filament.*`.
- **Fora do `src`:** `config/{filament,livewire,purifier}.php` e as deps de `composer.json` são
  tratados ao criar `config/`/`composer.json` em **F1** (o `src` não os contém).
- **Verificação:** 0 `Filament`/`Livewire`/`jQuery`/Bootstrap-CSS; `php -l` (**php:8.4-cli**) em
  **147 arquivos — 0 erros**.

### Reduzido (F0.I3.T3)

- **Observabilidade:** `src` sem stack pesada — log **JSON estruturado** + `X-Request-ID` e
  **OTel opcional** (perfil `telemetry`, fail-open) — ADR-024. Ref. pesada removida de
  `core/Internal/Exceptions/README.md`; texto de mídia sem menção a descriptografia.
- **Containers (referência em `.import/concordia/containers`):** descartados
  `balancer, loki, tempo, observability, telemetry, developer, tools`; mantidos
  `cache, cms, database, mailer, storage` como referência.
- **Destino:** os **6 serviços** (`web`/`php-fpm`/`queue`/`postgres`/`valkey`/**`storage` RustFS**) são
  materializados em **F1** (plano 04 + specs 16/17), não herdados do Concordia.
- **Verificação:** 0 tokens de observabilidade pesada em `src`.

### Normalizado (F0.I3.T4)

- **`down()` seguro:** as **6** migrações preservam dados renomeando para
  `backup_<tabela>_<timestamp>` (ADR-017); **0** `dropColumn`/`Schema::drop`/`dropIfExists`.
- **`up()` sem operações destrutivas:** removidos `Schema::dropIfExists` e
  `DROP TABLE ... CASCADE`; trigger de imutabilidade da auditoria agora usa
  `DROP TRIGGER IF EXISTS` após a criação da tabela.
- **`add_media_data`:** `after()` (MySQL) removido; `down()` **renomeia** a coluna para
  `media_data_backup_<ts>` em vez de `dropColumn`.
- **PG 18:** `uuidv7()` e `jsonb` confirmados; auditoria com `VARCHAR(n)` → **`TEXT`**.
- **Pendente (F4/ADR-028):** `noticias.content` (texto/HTML) → **`jsonb`** (AST TipTap) junto com o
  editor rico (o renderer semântico nasce em F2/F4).
- **Verificação:** `php -l` (**php:8.4-cli**) em **147 arquivos — 0 erros**.

### Reposto (F0.I3.T5)

- **Shell CMS** recriado em `src/layout/Cms` — namespace `Layout\Cms`, views `cms::`, **Blade +
  Tailwind 4 + daisyUI** (sem framework pesado):
  - `layouts/app.blade.php` com as seções **`page-breadcrumbs` / `page-actions` / `content`** e
    stacks `styles` / `modals` / `scripts` ("espaços, não controle");
  - partials `header`/`sidebar`/`footer`; componentes `<x-cms::button|card|breadcrumb|alert|empty-state>`;
  - `staticPages/`: `login` + `errors/{403,404,500,503}`; `Assets/css|js` mínimos.
- `CmsServiceProvider` registra views/componentes e é registrado por `LayoutServiceProvider`.
- Namespace corrigido em **ADR-009** e **plano 12** (`Cms\` → `Layout\Cms`), coerente com o PSR-4.
- **Acabamento visual/slots** seguem para **F3**; editor rico para **F4** (ADR-028).
- **Verificação:** 0 tokens proibidos; `php -l` (**php:8.4-cli**) em **162 arquivos — 0 erros**.

### Baseline (F0.I4.T1)

- **`composer.json`** criado na raiz com PSR-4 das 4 camadas
  (`Core\`→`src/core`, `Services\`→`src/services`, `Layout\`→`src/layout`, `Modules\`→`src/modules`)
  e `files: [src/core/helpers.php]`; `autoload-dev` `Tests\`→`tests/`.
- **`composer install`** (composer:2): gera `vendor/autoload.php` + `composer.lock`; PSR-4 mapeado.
- **Autoload verificado:** `PlatformArea`, `MediaType`, `ProblemDetailsException` resolvem; helpers
  `app_version()`/`portal_theme()` carregam.
  > **Nota (F2):** `src/core/helpers.php` foi **removido** na limpeza do core; a versão oficial agora
  > vive em `VERSION` (raiz) e é lida por `Core\Internal\System\SystemVersion` (spec 18 §6).
- **Verificação:** `php -l` em **162 arquivos — 0 erros**.

### Baseline (F0.I4.T2)

- **Dev tools:** `laravel/pint` 1.32 · `phpstan/phpstan` 2.3 · `phpunit/phpunit` 13.4 ·
  `laravel/framework` 12.70 (classes resolvem).
- **Pint:** `pint.json` (preset `laravel` + `declare_strict_types`); **102 arquivos** formatados,
  `pint --test` **PASS**.
- **PHPStan:** `phpstan.neon` nível **5** + `phpstan-baseline.neon` **encolhedor (38 erros)** →
  `phpstan analyse` **OK** (com `--memory-limit=1G`).
- **PHPUnit:** `phpunit.xml` + `tests/Unit/SmokeTest.php` → **2 test/s 6 assertions OK**.
- **Verificação:** pint/phpstan/phpunit **verdes**.

## Transposição (F0.I1.T3)

`src/` já contém as 4 camadas na topologia do ADR-003 (mais o marcador `src/tests-e2e`):

| Destino | Arquivos | PHP | Origem |
|---|---:|---:|---|
| `src/core/` | 127 | 73 | `.import/concordia/core/` |
| `src/layout/` | 61 | 47 | `.import/concordia/layouts/` |
| `src/services/` | 32 | 28 | `.import/concordia/services/` |
| `src/modules/` | 43 | 43 | `.import/concordia/modules/` |
| `src/tests-e2e/` | marcador | — | novo (ADR-003) |

- **Renomeado o topo** `Layouts\` → `Layout\` (namespace e arquivos `layout/Portal/Engine/AppLayout.php`
  e `layout/LayoutServiceProvider.php`); `Modules\...\Layouts\` internos **não** foram tocados.
- **PSR-4 verificado** sob o mapeamento `Core\→src/core`, `Layout\→src/layout`, `Services\→src/services`,
  `Modules\→src/modules`: **0 divergências** de namespace/arquivo.
- 79 arquivos sem `namespace` são legítimos: `.blade.php`, `core/helpers.php` (autoload `files`) e
  `Routes/`/`Migrations/` (sem namespace no Laravel).
- O `composer.json` (autoload PSR-4 + `files: src/core/helpers.php`) é criado em **F0.I4.T1** e
  **estendido** com o Laravel 12 e as dev tools em **F1.I2**.

## Issues e tasks

### `F0.I1` — Importar o snapshot
- **T1** Criar área de importação e copiar `../cms/` (código, sem `.git`) para o transplante.
- **T2** Inventariar por camada e contar arquivos; registrar o **manifest de importação**.
- **T3** Transpor para `src/core`, `src/layout`, `src/services`, `src/modules` (PSR-4 `Core\`,
  `Layout\`, `Services\`, `Modules\`) — ADR-003/ADR-013.

### `F0.I2` — Remover o específico
- **T1** Remover áreas/domínios do cliente: `Parceiros`, `Webhook`; avaliar `Super` (manter só se
  genérico); remover conteúdo/dados do Concordia.
- **T2** Remover specs/planos/`.agents` do Concordia (nossa fonte é `wiki/`).
- **T3** Mover trilhas não adotadas para `wiki/backlog/` e apagar do código: **YARA/WORM**,
  `ShreddableCast`/crypto-shredding, sonar, Loki/Tempo/Vector. **BLAKE3 permanece** (integridade/
  auditoria; ADR-029; extensão PHP pinada no runtime). **IndexNow permanece** (adotado no ADR-027).

### `F0.I3` — Polir e reduzir o framework (convergência aos ADRs)
- **T1** Eliminar `Result<T>`, **traits**, classes **abstratas** e **genéricos** (`HasAuditLog`,
  `ShreddableCast`, `@template`) — ADR-001/ADR-017.
- **T2** Remover **Filament, Livewire, Bootstrap, jQuery** — ADR-009. **TipTap permanece** como o
  único editor rico (ADR-028), mas desacoplado do Filament e vendorizado à parte.
- **T3** Reduzir a observabilidade pesada (Loki/Tempo/Vector → **JSON + OTel opcional**) — ADR-024.
- **T4** Normalizar migrações para **PG 18**: `uuidv7()`, `jsonb`, `down()` → `backup_*`, sem
  HTML/CSS/flags — ADR-007/ADR-017.
- **T5** Repor o **CMS shell** em Tailwind4/daisyUI (estrutura), deixando o acabamento visual para
  F3 — ADR-009.

### `F0.I4` — Baseline estático verde
- **T1** `composer install` + `dumping` do autoload das 4 camadas; `php -l` sem erro.
- **T2** `pint` + `phpstan` (baseline inicial **encolhedor**) + smoke PHPUnit.
- **T3** Publicar `manifest de importação` (ficou/removido) e fechar o épico com evidência.

## Manifest final (F0.I4.T3) — o que ficou × o que saiu

**Ficou (base do V7)**

- `src/core` (`Core\`): discovery/`AreaRegistrar`, audit (**BLAKE3**), messaging, `helpers.php`,
  exceptions (RFC 7807), geradores/stubs, enums.
- `src/services` (`Services\`): **Media** (ingestão/digestão), **SEO**, **Security**
  (encryption+hashing); **RichText** entra em F2 (ADR-028).
- `src/layout` (`Layout\`): **Portal** + shell **CMS** (`Layout\Cms`, Blade+Tailwind/daisyUI).
- `src/modules` (`Modules\`): **Blueprint**, **Demo**, **Noticias**.
- `src/tests-e2e/` (marcador; Playwright em F1/F3).

**Saiu**

- Áreas do cliente: **Parceiros**, **Webhook**, **Super** (multi-tenant → single-tenant).
- **Filament/Livewire/Bootstrap/jQuery** (PHP, configs, assets, stubs, `modules/*/Layouts/Cms`).
- **`Result<T>`** + DTO `ProblemDetails`, **traits**, **abstract**, **genéricos** (`@template`).
- **Crypto-shredding** (stream encryption), `ShreddableCast`, WORM (→ backlog).
- Observabilidade pesada (Loki/Tempo/Vector); containers reduzidos a referência mínima.

**Preservado (essencial)** — **BLAKE3** (ADR-029), **IndexNow** (ADR-027) e a decisão do **TipTap**
(ADR-028; editor implementado em F4).

**Números:** 162 arquivos PHP · 7 migrações · PSR-4 0 divergências · Pint 102 arquivos ·
PHPStan baseline **38** · PHPUnit **2/2** · `kd` doctor 13/13.

## Revisão pós-F1 (2026-10-15)

F0 revisado contra a árvore atual, sem regressão:

- Topologia `src/` = `core` · `layout` · `modules` · `services` · `tests-e2e` — OK.
- `Filament`/`Livewire`/`jQuery`/`trait`/`abstract class`/`@template` no código: **0**.
- `Result<`: **0** no código — as 3 ocorrências restantes são **referências negativas** em
  comentários/READMEs (ex.: “sem `Result<T>`”). Corrigido o `src/services/Media/README.md`, que
  ainda descrevia crypto-shredding e `Result<T>`.
- Migrations seguras: `tools/migration-check` OK (1 exceção justificada: `Noticias.content` → `jsonb` em F4/ADR-028).
- PSR-4: `Core\`, `Services\`, `Layout\`, `Modules\` resolvem via autoload — OK.

## DoD (binário)

- [x] Topologia `/src` correta (`core services layout modules` + `tests-e2e`), PSR-4 verde — **0 divergências**.
- [x] **Zero** `Filament`, `Livewire`, `Bootstrap`, `jQuery` (TipTap **é** o editor — ADR-028) — verificado.
- [x] **Zero** `Result<`, `trait `, `abstract class`, `@template` no código importado — verificado.
- [x] Migrações PG18 normalizadas; nenhum HTML/CSS/flags em schema — `backup_*`, sem destrutivos.
- [x] `php -l` + `pint` + `phpstan` (com baseline registrado) verdes — 162 arq / PASS / baseline 38.
- [x] `wiki/implementation/00-importacao-concordia.md` com manifest preenchido.

## Evidência esperada

`kd task close --id <F0.I4.T3> --outcome success --note "manifest: N arquivos; build verde"`.
