# 07 — Inventário, hashes e referências

> Rastreabilidade da consolidação: o que foi lido, onde está, qual o hash e como
> atualizar este diretório.

---

## 1. Commit e repositório

| Campo | Valor |
|---|---|
| Repositório | `v6-hardening/` |
| Remote | `https://git.pbsoft.com.br/PBSoft/php/prefeituras_v5.git` |
| Branch | `ticket/#23410-v6` |
| Commit | `ed413d85bdcf85a99ca5e4964fd692f8bf3145d8` |
| Assunto | `CHORE(PROJECT): Add env` |
| Autor | `stallone <stallone@maximatecnologia.com.br>` |
| Data | 2026-09-11 10:41:52 -03 |
| Assinatura | GPG (chave `A9D265A577B8334E4870B3E41D8F459175CB8A12`; chave pública ausente no ambiente) |
| Clone | **shallow** (`git rev-list --all --count` = 1) |

> O commit é um snapshot com 10.928 arquivos no `git show --numstat`. O histórico
> anterior não está disponível localmente. Os documentos citam commits como
> `11810cd53020bcaefedada72b1ab2ebab5b19707` (Debugbar/config.json) e
> `8325c73a493c52ea88373edaf5022b216c7283d1` (helpers globais), mas eles não
> podem ser inspecionados neste clone.

---

## 2. Documentos-fonte (`v6-hardening/wiki/infra-update/`)

| # | Arquivo | Tema | Uso neste diretório |
|---:|---|---|---|
| 1 | `WHM.md` | Passo a passo WHM: compressão, OPcache, APCu, verificação, rollback | `01`, `03`, `06` |
| 2 | `WHM_EXTENSIONS.md` | CloudLinux PHP Selector/alt-php (não aplicável ao EA4) | `01` §6 |
| 3 | `correcao-htaccess-whm-performance-l0.md` | Correção L0 no `.htaccess` + WHM | `02`, `01` |
| 4 | `correcao-php-ini-recomendado.md` | Templates de php.ini de conta e sistema | `03` |
| 5 | `correcao-cache-control-borda-l1.md` | `CacheControl`, ETag/304, CSRF, EA4 vs alt-php | `04`, `05` |
| 6 | `melhorias-cache-csrf-l1-l1.0.md` | Sumário das rodadas L1.1/L1.2/L1.0 | `04`, `05` |
| 7 | `correcao-bootstrap-cache-l2.md` | `config:cache`/`route:cache`, Closures, `env()` | `04`, `06` |
| 8 | `full-page-cache-l2-3.md` | FPC de origem: arquitetura, invalidação, testes | `04` |
| 9 | `full-page-cache-origem-l2-3.md` | FPC: regras de cacheabilidade, chave, TTL | `04` |
| 10 | `query-cache-layout-l2-4.md` | Cache de layout + eager loading + observers | `04` |
| 11 | `slow-queries-l3-4.md` | Índices, EXPLAIN, memoização, N+1 | `04` |
| 12 | `build-producao-l4-1.md` | Build de assets, manifest Mix/PWA, `immutable` | `04` |
| 13 | `vendorizacao-assets-l4-2.md` | Vendorização, preconnect, defer, reCAPTCHA | `04` |
| 14 | `webp-middleware-l5.md` | `PictureTransform`, variantes WebP, preload LCP | `04` |
| 15 | `html-minify-l6-1.md` | `HtmlMinify`, preservação de blocos, `//`→`/* */` | `04` |
| 16 | `melhorias-pre-borda-f1-f3-f2.1.md` | `sw.js`, `Vary`, robots/404, FPC key, CDN purge | `04`, `02` |
| 17 | `fase-final.md` | Raleway, Server-Timing, JS delivery, RUM, budget | `04` |
| 18 | `csp-epico-seguranca.md` | CSP/nonce, SEC-1a…SEC-5, enforce | `05` |
| 19 | `csp-ativar-mapear-scripts.md` | Como ligar CSP, listar violações, enforce | `05` |
| 20 | `correcao-upload-imagens-configuracoes.md` | Upload de imagens, path `..`, OPcache em dev | `04`, `06` |
| 21 | `correcao-debugbar-config-json-producao.md` | Debugbar `--no-dev`, `config.json` ausente | `04`, `06` |
| 22 | `correcao-composer-helpers-globais.md` | `autoload.files` em produção | `06` |

> **Arquivo literal:** os 22 documentos acima foram copiados integralmente para
> [`referencias/wiki-infra-update/`](referencias/wiki-infra-update/). Use essa
> pasta para diff/auditoria sem depender do repositório original.

### 2.1 Documentos de contexto no repositório

| Arquivo | Conteúdo |
|---|---|
| `v6-hardening/README.md` | Visão do projeto, stack, restrições, deploy, links |
| `v6-hardening/AGENTS.md` | Regras de consistência (stack travada, segurança, cache, testes) |
| `v6-hardening/OLD_README.md` | README legado (PostGIS, licitações, cPanel) |
| `v6-hardening/plan/` | Epics/planos (infra-update, security, CSP) |
| `v6-hardening/especificacoes/` | Especificações funcionais |
| `v6-hardening/.gitattributes` | Normalização EOL e `export-ignore` |
| `v6-hardening/.gitignore` | Itens ignorados (inclui `.env`, `config.json`, `.htaccess`) |

---

## 3. Arquivos literais copiados (`infra/arquivos/`)

O diretório [`arquivos/`](arquivos/) contém **109 arquivos** e um
[`manifest.sha256`](arquivos/manifest.sha256) gerado com:

```bash
cd infra/arquivos
find . -type f ! -name manifest.sha256 -print0 | sort -z | xargs -0 sha256sum > manifest.sha256
sha256sum -c manifest.sha256
```

### 3.1 Configuração/operação (curadoria)

| Arquivo | Origem | SHA-256 |
|---|---|---|
| `public.htaccess` | `v6-hardening/public/.htaccess` | `94df1c888c182db36077fded2e3a297e218f5beb2920920d305803432ec5d0ef` |
| `php.ini.recomended` | `v6-hardening/php.ini.recomended` | `f75dd3b38af35e0678937ca1d8dfdf8b57aee8ee1ea0a72183d11a03f36a21b3` |
| `whm.php.ini.recomended` | `v6-hardening/whm.php.ini.recomended` | `ad28420cf931de096bdd52b5969d9d4fbd0f98b5354fbced88347d62cd65a92c` |
| `deploy.sh` | `v6-hardening/deploy.sh` | `1c17a307485db5638dfc1f2acd255bc384301f761e5a60bc08cff51b57402fb1` |
| `env.example` | `v6-hardening/.env.example` | `f73cb99ee8818110fdb6f7b0bbb10e0e29c4256d5da51aa50d9e02406fce2e23` |
| `composer.json` | `v6-hardening/composer.json` | `cfa12b486bd638c9b2363a72e1753a70a76fd4cfbc11976231e84b6276447e9f` |
| `webpack.mix.js` | `v6-hardening/webpack.mix.js` | `aceda4d753b4da73a7937782c027a70dbc517992de9f2f1cf9bf3b811a37671f` |
| `migration-performance-indexes-l34.php` | `v6-hardening/database/migrations/2026_09_10_120000_add_performance_indexes_l34.php` | `dd9b7a8d4abf881e94e6e2e8f0f4900e75db0652c652b012a13cef601a8c3ba6` |

### 3.2 Configs (`arquivos/config/`)

| Arquivo | Origem | SHA-256 |
|---|---|---|
| `cache.php` | `v6-hardening/config/cache.php` | `4307e4c91c5857414dbb788c15ff196c183e2e4c5e375c70acf10b91865cd41d` |
| `cdn.php` | `v6-hardening/config/cdn.php` | `0b8017d74418d24ec11164da0b34ff498de635f2b28505436daac75ced338734` |
| `csp.php` | `v6-hardening/config/csp.php` | `931a86d9d573608a56580e73aff4ff1c2df91a1d4ae059dab9d746c49643c195` |
| `session.php` | `v6-hardening/config/session.php` | `f09e71d9a7b707c89349584e924ff845d36a425f04e24da1914d8c92dd89391c` |
| `gemini.php` | `v6-hardening/config/gemini.php` | `a64c323cda622ceced2ea34dde502b1df9b3c9f921a3d1fd34ed9056bbe93fec` |

### 3.3 Middlewares (`arquivos/middleware/`)

| Arquivo | Origem | SHA-256 |
|---|---|---|
| `Kernel.php` | `v6-hardening/app/Http/Kernel.php` | `d4a3c642153ba50f14ad7771c84196361b63212540267b9aa9c6a624aeeca03b` |
| `CacheControl.php` | `v6-hardening/app/Http/Middleware/CacheControl.php` | `2768df5a72b465f34d67ab13edb9faeba3b9ff459986a95ccf46982cd48ade62` |
| `PageCache.php` | `v6-hardening/app/Http/Middleware/PageCache.php` | `6d7c81c385cc28747aaa2b288ae9e99a6850a7236c8a3ee649133c8c113656b8` |
| `CspNonce.php` | `v6-hardening/app/Http/Middleware/CspNonce.php` | `af206365d1211e2433af4e6b0d6763802ad77cfc09bbba297645fc9091129364` |
| `HtmlMinify.php` | `v6-hardening/app/Http/Middleware/HtmlMinify.php` | `331e873b61640784e19a68c5fc1c8dc5f8393b9feca9ec4fd1670e233f1d91d6` |
| `PictureTransform.php` | `v6-hardening/app/Http/Middleware/PictureTransform.php` | `44402dda5c66a74dc40306390bfed993d515a7104de57eae1f71971777647f6b` |
| `PreloadCritical.php` | `v6-hardening/app/Http/Middleware/PreloadCritical.php` | `0eed93b9d25c38bca1728c353a85e31a0cf836286bf66796ffdbcd4656cb1581` |
| `ServerTiming.php` | `v6-hardening/app/Http/Middleware/ServerTiming.php` | `0c7eca1933415e95b2d3c35bee7bb66107b8dbf6cefc20f1c9f6f3fa7e8efd11` |

### 3.4 `.htaccess` de proteção de upload (`arquivos/htaccess/`)

| Arquivo | Origem | SHA-256 |
|---|---|---|
| `storage-app-public.htaccess` | `v6-hardening/storage/app/public/.htaccess` | `502099e6b3b0ea85952539a79a630730eef5f70258a4c08f3d8b22284cb4cd67` |
| `public-img.htaccess` | `v6-hardening/public/img/.htaccess` | `502099e6b3b0ea85952539a79a630730eef5f70258a4c08f3d8b22284cb4cd67` |
| `storage-app-public-img.htaccess` | `v6-hardening/storage/app/public/img/.htaccess` | `502099e6b3b0ea85952539a79a630730eef5f70258a4c08f3d8b22284cb4cd67` |
| `storage-img.htaccess` | `v6-hardening/storage/img/.htaccess` | `502099e6b3b0ea85952539a79a630730eef5f70258a4c08f3d8b22284cb4cd67` |

> Esses quatro arquivos são idênticos: desligam engine PHP/execução de CGI no
> diretório de uploads e forçam `.html`/`.htm` a `text/plain`. SHA idêntico é
> esperado.

### 3.5 Árvore de código (`arquivos/codigo/`)

**83 arquivos** copiados preservando o caminho relativo ao repositório. Inclui
middlewares, `Kernel`, controllers, traits, models, providers, services,
comandos, rotas, configs, `composer.json`, `deploy.sh`, `.env.example`,
`public/.htaccess`, `php.ini.recomended`, `whm.php.ini.recomended`, `server.php`,
`public/*` (index/web.config/sw.js/offline/robots/sitemap/mix-manifest), `.gitlab-ci.yml`,
`.gitattributes`, `.editorconfig`, `phpunit.xml`, `lighthouse/*`, migration,
testes e partials Blade (`csrf-inject`, `pwa`, `preconnect`).

```text
infra/arquivos/codigo/
├── app/
│   ├── Console/{Kernel.php,Commands/{ClearPageCache,RedigestWebpImages}.php}
│   ├── Exceptions/Handler.php
│   ├── Http/
│   │   ├── Controllers/{Portal,Prefecture}/...
│   │   ├── Middleware/{CacheControl,PageCache,CspNonce,HtmlMinify,PictureTransform,
│   │   │                 PreloadCritical,ServerTiming,VerifyCsrfToken}.php
│   │   ├── Model/Prefecture/{Content,Configuration}.php
│   │   ├── Requests/ConfigurationRequest.php
│   │   ├── Traits/{GetInformationsPrefectureTrait,NewsTrait,FileTrait}.php
│   │   └── Kernel.php
│   ├── Providers/{App,Menu,Footer,ConfigHeader,Banner,NewsMorePopular}ServiceProvider.php
│   └── Services/Cdn/CdnPurgeService.php
├── config/{app,cache,cdn,csp,database,debugbar,filesystems,gemini,mail,recaptcha,
│           session,trustedproxy,view}.php
├── database/migrations/2026_09_10_120000_add_performance_indexes_l34.php
├── public/{.htaccess,index.php,web.config,sw.js,offline.html,robots.txt,
│            sitemap.xml,mix-manifest.json}
├── resources/views/portal/layouts/{csrf-inject.blade.php,partials/{pwa,preconnect}.blade.php}
├── routes/{web,basepro}.php
├── tests/Unit/{CacheControl,PageCache,LayoutCache,CspNonce,PerformanceIndex,
│                EagerLoadMemoize,CdnPurgeService}Test.php + CountingCacheRepository.php
├── .env.example, .editorconfig, .gitattributes, .gitignore, .gitlab-ci.yml,
├── composer.json, deploy.sh, php.ini.recomended, phpunit.xml, server.php,
├── webpack.mix.js
└── lighthouse/{README.md,budget.json}
```

### 3.6 Referências arquivadas

| Pasta | Conteúdo |
|---|---|
| [`referencias/wiki-infra-update/`](referencias/wiki-infra-update/) | 22 documentos originais de `v6-hardening/wiki/infra-update/`. |
| [`referencias/plan/`](referencias/plan/) | 5 planos: `2026-08-09-infra-update.epic.md`, `2026-09-10-csp-enforce-edge-coexistence.md`, `2026-09-10-pwa.md`, `2026-09-10-security-epic.md`, `2026-09-11-continuidade-borda.epic.md`. |
| [`referencias/lighthouse/`](referencias/lighthouse/) | `README.md` + `budget.json` originais. |
| [`referencias/projeto/`](referencias/projeto/) | `README.md`, `AGENTS.md`, `OLD_README.md` do snapshot. |

> Os 22 docs originais **não foram reescritos**. A consolidação crítica está nos
> capítulos `01`–`10`; quando um doc original contradiz o código, o capítulo
> consolidado aponta a discrepância (ver `10-achados-e-patches.md`).

---

## 4. Código/config de referência (também copiado em `arquivos/codigo/`)

> A análise detalhada das mudanças de código está em
> [`08-melhorias-codigo.md`](08-melhorias-codigo.md), com snippets e
> justificativa por arquivo. A tabela abaixo é só o inventário de caminhos; os
> arquivos estão em `arquivos/codigo/`.

| Caminho | Papel |
|---|---|
| `app/Http/Kernel.php` | Ordem do grupo `web`, `$middlewarePriority`, route middleware. |
| `app/Http/Middleware/CacheControl.php` | Cache público, CSRF strip, ETag/304, Vary. |
| `app/Http/Middleware/PageCache.php` | FPC, normalização de URL, invalidação, versão, CDN purge. |
| `app/Http/Middleware/CspNonce.php` | CSP/nonce, injeção, HIT do FPC, política. |
| `app/Http/Middleware/HtmlMinify.php` | Minificação de HTML. |
| `app/Http/Middleware/PictureTransform.php` | `<img>` → `<picture>` WebP. |
| `app/Http/Middleware/PreloadCritical.php` | Preload de CSS crítico. |
| `app/Http/Middleware/ServerTiming.php` | Header `Server-Timing`. |
| `app/Http/Controllers/Portal/CsrfTokenController.php` | Endpoint `/csrf-token`. |
| `app/Http/Controllers/Portal/CspReportController.php` | Coletor CSP. |
| `app/Http/Controllers/Portal/RobotsController.php` | `robots.txt` dinâmico. |
| `app/Http/Controllers/Portal/SitemapController.php` | `sitemap.xml` dinâmico (validar). |
| `app/Providers/AppServiceProvider.php` | Debugbar condicional, observers de invalidação. |
| `app/Providers/*ServiceProvider.php` | Cache de layout (menu/footer/header/banner/news). |
| `config/cache.php` | FPC, ignored params, invalidate models. |
| `config/cdn.php` | Purge Multi-CDN (no-op default). |
| `config/csp.php` | Liga/desliga CSP. |
| `config/session.php` | `secure`, `http_only`, `same_site`. |
| `config/gemini.php` | `env()` centralizado para `config:cache`. |
| `composer.json` | `autoload.files`, `apcu-autoloader`, script `prod`. |
| `deploy.sh` | Deploy idempotente. |
| `public/.htaccess` | Hardening + performance de conta. |
| `routes/web.php` | CSP report, csrf token, robots/sitemap. |
| `routes/basepro.php` | Rotas sem Closure (route:cache). |
| `database/migrations/2026_09_10_120000_add_performance_indexes_l34.php` | Índices L3.4. |
| `tests/Unit/CacheControlTest.php` | Cache/ETag/CSRF/Vary. |
| `tests/Unit/PageCacheTest.php` | FPC/HIT/keys/flush. |
| `tests/Unit/LayoutCacheTest.php` | Invalidação de layout. |
| `tests/Unit/CspNonceTest.php` | CSP/nonce/HIT. |
| `tests/Unit/PerformanceIndexTest.php` | Índices/EXPLAIN. |
| `tests/Unit/EagerLoadMemoizeTest.php` | N+1/memoização. |
| `tests/Unit/CdnPurgeServiceTest.php` | Purge no-op/erros. |
| `tests/Unit/ExampleTest.php` | Stub; não é prova de comportamento. |

---

## 5. Testes e evidências documentadas

| Suíte | Evidência no doc |
|---|---|
| `CacheControlTest` | ~20–21 testes / ~60 asserções; ETag fraco, 304, Vary sem UA, strip de token. |
| `PageCacheTest` | HIT/MISS, escopo `Portal\`, POST, csrf, flush, normalização, versão. |
| `LayoutCacheTest` | Cache de providers + invalidação por model events. |
| `CspNonceTest` | Header/nonce, injeção, HIT, CSP desligado. |
| `PerformanceIndexTest` | 15 testes / 43 asserções; `enable_seqscan=off` + EXPLAIN. |
| `EagerLoadMemoizeTest` | 2 testes; memoização + eager loading. |
| `CdnPurgeServiceTest` | No-op, provider desabilitado, provider mal configurado. |
| Suíte completa | Documentada em 55/70 testes conforme a rodada; falha aceita: stub `Tests\Feature\ExampleTest` (302 em `/`). Números variam entre rodadas. |

> Números variam entre documentos porque as rodadas adicionaram testes ao longo do
> tempo. O importante é o conjunto de invariantes cobertos.

---

## 6. Comandos usados na consolidação

```bash
# inventário
find v6-hardening -path '*/.git' -prune -o -type f -print
git -C v6-hardening log --all --oneline
git -C v6-hardening show --numstat --format='' HEAD

# leitura dos docs
for f in v6-hardening/wiki/infra-update/*.md; do cat "$f"; done

# cópia literal
cp -p v6-hardening/public/.htaccess infra/arquivos/public.htaccess
cp -p v6-hardening/php.ini.recomended infra/arquivos/php.ini.recomended
cp -p v6-hardening/whm.php.ini.recomended infra/arquivos/whm.php.ini.recomended
# ... demais arquivos

# integridade (todas as cópias, inclusive codigo/)
cd infra/arquivos
find . -type f ! -name manifest.sha256 -print0 | sort -z | xargs -0 sha256sum > manifest.sha256
sha256sum -c manifest.sha256
```

---

## 7. Como atualizar este diretório

1. Atualizar o repositório `v6-hardening` (preferencialmente com histórico
   completo, não shallow).
2. Revisar `wiki/infra-update/*.md` e os arquivos de código/config citados.
3. Reexecutar as cópias literais para `infra/arquivos/` (sobrescrever) e para
   `infra/arquivos/codigo/` (preservando o caminho relativo).
4. Recalcular `manifest.sha256` e atualizar as tabelas deste documento.
5. Revisar os achados em `10-achados-e-patches.md` (especialmente F-01/CSP,
   F-02/cache e F-06/OPcache) antes de aplicar qualquer patch.
6. Nunca commitar/publicar sem pedido explícito; este diretório é documentação.

---

## 8. Aviso de escopo

- Este material **não substitui** o `AGENTS.md` do projeto; ele consolida e
  explica.
- Comandos de WHM/root devem ser executados por quem tem acesso e backup.
- Cópias literais são **snapshots**; o arquivo em produção pode ter sido alterado
  depois do commit `ed413d8`.
- Em caso de conflito entre este documento e o código em produção, **o código e o
  `phpinfo`/WHM reais vencem**.
