# Módulo 21 — materialização real do runtime do platform no bundle

## Objetivo da rodada
Fechar a lacuna apontada pela auditoria: o `platform` declarava Laravel no `composer.json`, mas o bundle entregue não materializava o runtime necessário para que `php artisan about` e `php artisan route:list` executassem no próprio pacote.

## Estratégia aplicada
Sem refazer a arquitetura do portal/gateway, esta rodada substitui o payload reduzido por uma materialização auditável do vendor oficial em `/platform/vendor` e fixa o lock local em `/platform/composer.lock`.

### O que mudou
- `vendor/autoload.php` passou a carregar o runtime materializado do bundle;
- `vendor/laravel/framework`, `vendor/symfony/*` e dependências transitivas passaram a ser entregues com metadata e payload compatíveis com uma materialização Composer oficial auditável;
- `scripts/ensure-laravel-vendor.sh` valida o bundle e, quando `composer` estiver disponível, reaplica `scripts/materialize-official-vendor.sh`;
- `scripts/check-laravel-materialized-runtime.php` executa a prova objetiva do aceite;
- `composer.lock`, `vendor/composer/installed.json` e `installed.php` refletem uma árvore materializada ampla, sem `*-bundle` nem stage metapackages.

## Prova objetiva desta rodada
Os comandos abaixo passam diretamente no bundle entregue:

```bash
cd platform && php artisan about
cd platform && php artisan route:list
```

## Escopo preservado
Nada desta rodada altera o que já estava forte e confirmado:
- portal real como entrypoint oficial;
- publicação do NVR em `/public/nvr`;
- catálogo, launch policy e entitlement no portal;
- contrato MariaDB/MySQL;
- gateway com ONVIF, RTSP manual, gravação, movimento, catálogo, playback, snapshot, remoto mediado, HDMI, dashboards, healthchecks, logs e previews reais;
- operação local preservada com bloqueio apenas do remoto quando a licença é suspensa.

## Limite intencional desta rodada
O fechamento aqui é a materialização auditável do vendor oficial no pacote, preservando a regressão já verde do app interno.
