# Módulo corretivo final 23 — /nvr funcional de verdade via portal real, sem HTTP 500

## Escopo

Fechamento operacional do fluxo publicado em `/nvr` no **root real** do bundle, preservando o portal como entrypoint oficial e o NVR como produto integrado sob subpath.

## Correções aplicadas

### 1. Entrada oficial do portal preservada no runtime montado

O bridge público do portal agora injeta dois contextos distintos no runtime do `platform`:

- `APP_URL` e URLs de produto NVR continuam apontando para a aplicação montada em `/nvr`;
- `CENTRAL_APP_URL` e `SSO_CENTRAL_ENTRYPOINT_URL` passam a apontar para a raiz oficial do portal, removendo o sufixo `/nvr` do mount publicado.

Com isso, falhas fechadas de `/nvr` e `/nvr/launch.php` deixam de redirecionar para um workspace interno do próprio `/nvr`, evitando loop e preservando o contrato "portal como entrada oficial".

### 2. Sessão do NVR isolada no subpath publicado

O boot de sessão do `platform` passou a aplicar explicitamente os parâmetros de cookie antes do `session_start()`, usando a configuração materializada de sessão.

Efeito prático:

- o cookie do NVR fica escopado ao subpath montado (`/nvr`);
- a contingência técnica continua funcionando sem disputar a sessão principal do portal;
- o smoke HTTP do bundle consegue verificar o isolamento de cookie no entrypoint técnico.

### 3. Regressão HTTP real do portal + /nvr

Foi adicionada a validação executável `scripts/check-portal-nvr-http-runtime.php`, que:

- sobe `portal/public` em `php -S` local;
- testa `GET /nvr`;
- testa `GET /nvr/launch.php?ticket=qualquer-coisa`;
- testa `GET /nvr/login-tecnico`;
- testa asset estático montado sob `/nvr/assets/...`.

Essa validação falha o pipeline se o bridge público voltar a produzir HTTP 500, loop interno ou perda de assets/cookie/path sob `/nvr`.

## Resultado esperado

- `GET /nvr` não retorna 500;
- `GET /nvr/launch.php?ticket=qualquer-coisa` não retorna 500;
- a ausência de contexto falha fechado para o entrypoint oficial do portal;
- assets, sessão e navegação permanecem íntegros em `/nvr`.
