# QA — alinhamento de `sucesu_analise` ao `public-v7`

Data: 2026-10-21. Escopo: camada de **destino** (`09_reimplementacao/` e
`v7_implementation/`). O corpus `01_..08_` documenta o legado e não é cobrado por esta
auditoria; ele deve continuar descrevendo Bootstrap, Sentinel, `v2_*` e PHP 7.4 quando for
o fato observado.

Referências: `public-v7/AGENTS.md`, ADR-001/004/007/009/013/014/015/016/020/022/024/025/
026/027/028/030/033/034/035/037/041/042/043, skills `php-84-correct` e `laravel-12`.

## 1. Veredito

**Não há pleno alinhamento.** A camada de destino declara a constituição correta
(PHP 8.4/Laravel 12/PG 18, token canônico, sem Bootstrap/jQuery, seeds demo, ETag/304,
TipTap/AST), mas os artefatos executáveis ainda codificam o legado em pontos que a
constituição proíbe. O `check_impl.py` passa porque valida front-matter, seções e cercas de
código — não compila PHP nem verifica semântica de ADR.

## 2. Bloqueios constitucionais

| ID | Achado | Evidência | Correção necessária |
|---|---|---|---|
| A-01 | **ETL ainda é oferecido como modalidade.** ADR-042 proíbe ETL, `legacy_mapping`, quarentena e base de compatibilidade; o plano oferece “Modo A — cutover com ETL” e o README manda decidir “ETL × curadoria”. | `09_reimplementacao/pilha-alvo-public-v7.md:154,159-167,199-200,270`; `09_reimplementacao/migracao-de-dados.md:31,43`; `README.md:132` | Remover o Modo A e reescrever `migracao-de-dados.md` como custódia/exportação e curadoria (ADR-042). Se o produto exigir ETL, é emenda formal de ADR pelo humano — o agente não pode decidir. |
| A-02 | **A ordem de construção manda criar Sentinel, `v2_roles`, `v2_uuid`, `v2_can`, nonce, `HtmlMinify` e views `v2-*`.** O próprio documento diz para não portar isso. | `09_reimplementacao/ordem-de-construcao.md:110-111` (artefatos/contratos de E1) | Reescrever E1 com `cms_users`, `core_roles.permissoes` jsonb, `core_audit_logs`, `ModuleActivation`, `Permission`, CSP estática e views `cms::`/`portal::`. |
| A-03 | **Auth/RBAC de destino usa o schema do legado.** `core/autenticacao` lista `users`, `persistences`, `activations`, `reminders`, `throttle`, `roles`, `role_users`, `v2_roles`; o código usa `Auth::attempt(..., remember)` e testa `App\Models\User`. | `v7_implementation/core/autenticacao/README.md:69,112-119,126-127`; 37 docs usam `App\Models\User::factory()` | `cms_users` + guard `web`/provider eloquent, Argon2id, `session()->regenerate()`, mensagem genérica, logout `POST`+CSRF, throttle e-mail+IP com 429/`Retry-After`, auditoria de login. Remover “remember me” (ADR-037). |
| A-04 | **Vocabulário de permissão errado e declaração ausente.** Docs usam `noticias.write`, `mail-audit.read`, `support.manage`, `FeedRss:write`; nenhum dos 20 `ModuleProvider` declara `'permissions' => Permission::ACTIONS`. | `v7_implementation/modules/publicacoes/noticias/README.md:126`; `core/autenticacao` e todos os módulos | Usar `{module}.{ver|editar|aprovar|arquivar}`, declarar as ações no `ModuleProvider::config()` e autorizar com `Permission::authorize()`/Gate, deny-by-default (ADR-033). |
| A-05 | **Auditoria ainda é `activity_log` do spatie.** Não há `core_audit_logs`, `AuditWriter`, BLAKE3 nem snapshot de ator. | `v7_implementation/services/auditoria/README.md:119-126`; grep: 0 docs com `core_audit_logs`/`BLAKE3`/`AuditWriter` | Implementar o audit trail do ADR-035; `activity_log` pode ser apenas comportamento legado do MailAudit, nunca o destino. |

## 3. Desvios sistêmicos

| ID | Achado | Contagem / evidência | Efeito |
|---|---|---|---|
| B-01 | Rotas nomeadas `v2.*` ainda aparecem em tabelas de destino | 31 docs | Implementador copia `v2.noticias.cms.index` em vez de `cms.noticias.index` |
| B-02 | Views `v2-*` ainda aparecem em respostas/matrizes | 13 docs (ex.: `v2-noticias::cms.index`) | Contraria `cms::`/`portal::`/`<token>::` do contrato |
| B-03 | Tabelas `v2_*` ainda aparecem em docs de destino | 25 docs | Falta mapa canônico aprovado; docs estão `status: pronto` com decisão bloqueante |
| B-04 | Middleware legado `module.active` | 20 docs | Alias do alvo é `module.activation` (ADR-034); o comportamento 404 está certo, o nome não |
| B-05 | `V2PermissionMiddleware` / `CmsAuthenticate` | 6 / 28 docs | Substituir por `auth`/`can`/Permission e guard do CMS; não recriar a pilha V2 |
| B-06 | Serviços com nomes do legado | 13 pastas; só 1 doc menciona `RichText` | ADR-015/028 usam `Media`, `Seo`, `RichText`, `Audit`; os demais são backlog, não núcleo |
| B-07 | UI não usa o shell único | Só 1 doc contém `<x-layout::...>` | Todo módulo deve usar exatamente `<x-layout::cms>` ou `<x-layout::portal>` e preencher só `<main>` (ADR-016) |
| B-08 | Seeds fora do layout canônico | 3 docs (ex.: `src/demonstration/SeedsSle/`, namespace `Demonstration`) | ADR-041 exige `src/demonstration/{Module}/{Seed}.php` e namespace `Demonstration\{Module}` |
| B-09 | PHP inválido nos snippets | 9 docs com `{{`/`}}` em cercas PHP (boot, auth, segurança, dados, regional, controllers, helpers, runtime, a11y) | O código não compila; `check_impl.py` não detecta |
| B-10 | Falta o bootstrap Laravel 12 e o guard do CMS | 0 docs com `bootstrap/app.php`, 0 com `config/auth.php`, 0 com `cms_users`/`core_roles`/`Argon2id` | O plano não mostra como a aplicação sobe nem como o login do CMS é configurado |
| B-11 | `make check` não é o gate único | 51 docs citam `make check`, mas também tratam `php artisan test`/PHPStan/Pint como comandos canônicos | AGENTS: `make check` é o único caminho; os demais são diagnóstico interno |

## 4. O que já está alinhado

- Declaração da pilha: PHP 8.4/Laravel 12/PostgreSQL 18/Valkey 9, `src/core|services|layout|modules`.
- Rejeição explícita de Bootstrap/jQuery/AdminLTE, Sentinel como pacote, nonce por request,
  `HtmlMinify` e HTML livre (o texto está correto; a execução é que diverge).
- TipTap + AST JSON + renderers PHP, sem nó de HTML livre (ADR-028).
- ETag/304, cache público sem formulário, CSP estática, sem minify (`core/runtime`).
- Seeds como demonstração (texto) e eMAG 3.1 + WCAG 2.2 AA como meta.
- DI por construtor, clock/ID injetados, `declare(strict_types=1)`, sem traits/abstract/
  genéricos nos snippets (a intenção está registrada).

## 5. Por que o gate atual dá verde

`tools/check_impl.py` verifica:

- front-matter e valores de `tipo`/`camada`;
- presença das 11 seções;
- mínimo de 3 cercas de código;
- ausência de `TODO`/`PREENCHER`;
- links relativos.

Ele **não** executa `php -l`, não valida nomes de rota/tabela/view, não lê as ADR e não
compara o contrato com o código. Portanto `51/0` significa “documentos bem formados”, não
“planos alinhados”.

## 6. Correção mínima antes de implementar

1. **Decidir A-01:** remover ETL ou obter emenda formal do ADR-042. Sem isso, o resto é
   ambíguo.
2. **Reescrever E1** (`ordem-de-construcao.md`) e o plano de auth para o schema/guard do
   CMS.
3. **Normalizar os 51 docs** em uma passada semântica: `v2.* → cms.*`, `v2-* → cms::`/
   `portal::`/`<token>::`, `v2_* → canônico`, `module.active → module.activation`,
   `V2PermissionMiddleware`/`CmsAuthenticate` → `auth`/`can`.
4. **Substituir permissões** por `ver|editar|aprovar|arquivar` e declarar no
   `ModuleProvider`.
5. **Trocar a auditoria** para `core_audit_logs`/`AuditWriter`/BLAKE3.
6. **Corrigir os snippets** (`{{`), adicionar `bootstrap/app.php`, `config/auth.php`,
   `cms_users`, Argon2id e tipos de retorno.
7. **Renomear/limitar serviços** ao núcleo ADR-015 e marcar o restante como backlog.
8. **Corrigir seeds e shell** e só então revalidar com um checker que compile PHP e
   detecte tokens proibidos.

Até 1–7, o corpus continua útil como engenharia reversa, mas `status: pronto` em
`v7_implementation` superestima o que está implementável.
