# D6 — Higiene: limpeza geral + documentação atualizada/padronizada

| Campo | Valor |
|---|---|
| **Fase** | F4 — Produto & CMS (transversal) |
| **Issue** | D6 (task avulsa) |
| **kd task** | `task_01x4p2aq` (`closed`) |
| **Âncora** | `wiki/implementation/README.md` |
| **Status da revisão** | 🔧 com correções |

## O que foi implementado

- README de implementação sincronizado ao `kd`; `04-produto-cms.md` atualizado; dead code de Notícias removido (para `.pi/trash/`).
- `make docs-check` verde.

## Arquivos para revisar

- `wiki/implementation/README.md`
- `wiki/implementation/04-produto-cms.md`
- `CONTRIBUTING.md`
- `AGENTS.md`
- `.pi/trash/**` (código morto descartado)

## Pontos de revisão

### PHP 8.4
- [ ] `declare(strict_types=1)`; tipos nativos (union/enum/`readonly`); sem `mixed` desnecessário.
- [ ] Dependências **injetadas** (nenhum `new`/`app()`/`resolve()` no corpo); sem traits/abstract/generics.
- [ ] `match` em vez de cadeias de `if`; `?->`/`??`; sem código morto; PHPStan `max` limpo.

### Laravel 12
- [ ] Nativo primeiro (Eloquent casts/scopes, `FormRequest`, `Gate`, scheduler, events) — sem reimplementar.
- [ ] Sem closure em rota; resources/rotas nomeadas; `config()` só lê, `env()` só em `config/`.
- [ ] Migração **idempotente**; `down()` → `backup_*` (nunca `DROP`); sem `orderBy` cru quando `latest/oldest` serve.

### HTML semântico + a11y (eMAG/WCAG 2.2 AA)
- [ ] Um `<main>`, headings em nível correto, landmarks; só ARIA quando necessário.
- [ ] Alvos ≥ 24 px (≥ 44 px em ponteiro grosso); foco visível; rótulos em todos os campos; contraste (axe).
- [ ] Funciona **sem JS**; `sniffCSS` sem `fail`/`warn` fora do ledger.

### CSS moderno
- [ ] `oklch`, `clamp`, `rem`/`fr`/`dvh`/`%`; `@layer` (a11y por último); `@property`; subgrid com fallback.
- [ ] Sem `!important`, sem `style="…"` inline, sem hex/rgb (exceto justificado); sem CDN.

### Decisões do projeto (ADRs)
- [ ] Respeita a ADR do escopo (ver cabeçalho) e não escapa das demais (001, 002, 004, 013, 015…).
- [ ] Determinismo: relógio/id injetados, ordem explícita, dados idempotentes (ADR-001).

### i18n (ADR-012)
- [ ] Nenhuma string visível fixa; 4 locales com paridade de chaves; `route()`/`localized_url()` (nunca path literal).

### Observabilidade/segurança/testes
- [ ] Span + `log_event('{module}.{action}')` com atributos `scalar|null`, **sem PII** (ADR-024).
- [ ] Teste que falha sem a mudança (vermelho→verde) + evidência no `kd`; `make quality` 2×.

### Específicos desta task

- [ ] Docs refletem o código; sem referência stale (ex.: `services/SEO` legado).
- [ ] Nada morto no tree (`resources/js`, controllers órfãos).

## Comandos úteis

```bash
make quality            # lint + PHPStan max + gates + testes
make e2e                # Playwright + axe (se a task toca UI)
make check-boundaries   # fronteiras core/services/layout/modules
```

---

> Revisar contra `AGENTS.md`, `wiki/adr/` e o plano citado. Registrar achados no `kd` (`kd write --anchor`) e, se houver correção, teste de regressão.

## Notas da revisão

| Data | Revisor | Resultado | Observações |
|---|---|---|---|
| 2026-10-18 | agente | 🔧 | **A** (**alto**) a **constituição** prescrevia comandos **aposentados**: o bloco *Approval / test gates* já citava `make check`, mas sobraram `make lint`, `make e2e` (×2), `make a11y` (×2) e `make docs-check` — nenhum existe — e os números envelheceram (**6 histórias / 3 projetos** × **14 / 4** reais), tudo **sem gate** (a garantia do `src/` não cobria a raiz) → corrigido para `make check` / `make check E2E=1` / a etapa `a11y` do `make check` / `tools/docs-check.sh`, contagens atualizadas, e **dois gates novos** (`every_make_target_referenced_in_the_normative_docs_exists` em `DocsReferencesTest`, que extrai o helper `missingMakeTargets()` reaproveitado pelo teste de `src/`; e `the_constitution_cites_the_real_number_of_histories_and_projects` em `E2eDocsTest`, que **deriva** as contagens da árvore e do `playwright.config.ts`) — ambos **vermelhos antes** (`fact_00ysl5ag`); **B** (médio) o mesmo defeito em `CONTRIBUTING.md`, no índice `wiki/implementation/README.md` (a *Convenção de DoD por fase* citava `check-boundaries`/`check-grep`/`check-vendor`/`e2e`/`coverage-check`/`quality` 2×) e em **12 specs** — 36 substituições pelo caminho dourado/`make exec cmd='…'`, agora cobertas pelo gate normativo (`fact_00epdbn3`); **C** (médio) a tabela **Estado** estava **stale** (F5 `1/12` com o `kd` em `5/12`) e o `13/13` da F4 não batia com o `13/18` do `kd` → números corrigidos + regra de contagem explicitada (o denominador do `kd` inclui as **tasks de revisão** criadas depois do fechamento do escopo) (`risk_013jd913`); **D** (médio → `task_00tbqx0x`) os **registros** (`wiki/plan/**` 33 linhas, `wiki/adr/**` 11, os relatos `wiki/implementation/0*.md`) seguem citando alvos mortos — ficam **fora** do gate de propósito (são ata do que foi executado, com os comandos da época) e a task foi atualizada com o inventário (`risk_00o5fn3y`); **E** (baixo) `wiki/specs/12-postgres-18.md` prescrevia `make psql` — alvo inexistente **e** impossível (o container `php-fpm` não traz o cliente `psql`) → `docker compose exec postgres psql` (`fact_010roqmo`); **F** (baixo) o exemplo de código da **ADR-015** usa `Services\SEO\Contracts\SeoBinder` (o namespace real é `Services\Seo`, case-sensitive) — um copy-paste não resolve; **G–J** (obs) as tasks de **revisão** ligadas a um épico **fechado** fazem o progresso divergir (proposta: issue própria para a revisão — `risk_013jd913`); `E2eDocsTest` e `DocsReferencesTest` verificam alvos `make` em escopos que se sobrepõem (`src/tests-e2e/**`); itens soltos na raiz de `.pi/trash/` fora do padrão `slug-data`; e `make psql` seria útil (mas a decisão é superfície mínima). **Verificado OK:** `resources/js` **não existe** (o Vite aponta só para `src/*/Assets`) e `resources/views/errors/problem.blade.php` **é usado** pelo `ProblemDetailsHtmlRenderer` → nada morto no tree; `.pi/` é **gitignored** (o descarte não entra no repositório) e os itens descartados (Analytics controller, `ProcessNoticiaCoverMedia`, partial legado, stubs do Blueprint) têm **zero** referências vivas; `docs-check` verde (12 specs com dono/status e link); a tabela Estado agora bate com o `kd`. `make check E2E=1`: 20 OK · 0 FAIL · 1 SKIP, e2e **91 passed**, cobertura **91,13%**. |

> Resultado: `✅ revisado` · `🔧 com correções` · `⏭️ delegado` (com justificativa).
