# MÓDULO FINAL 24 — SSO oficial, fail-closed e contexto realmente operacional

## Escopo
Correção aplicada no **root real** do bundle para fechar o fluxo oficial:
- portal como entrypoint principal;
- NVR publicado em `/nvr`;
- `launch.php` assinado e auditável;
- falha fechada sem HTTP 500 para acesso sem contexto válido;
- login técnico local preservado apenas como contingência explícita.

## Correções aplicadas
1. `platform/bootstrap/autoload.php` agora carrega o `.env` do próprio `/platform` antes da configuração da aplicação.
2. `portal/bootstrap/public_nvr_bridge.php` sincroniza contexto de mount e URLs do NVR sob `/nvr`.
3. `platform/app/Http/Middleware/BootApplicationSessionState.php` materializa o cookie da sessão integrada com `path=/nvr`.
4. `platform/src/Http/Controllers/Auth/PortalLaunchController.php` fecha o launch oficial no runtime real e, quando o banco central não está disponível no ambiente de validação, abre uma sessão transitória **somente** a partir de ticket oficial válido e auditado.
5. `platform/src/Domain/Auth/AuthService.php`, `TenantContextService`, `ClientContextService` e `AuthorizationService` respeitam o snapshot transitório do launch oficial sem materializar sessão indevida por acesso direto.
6. `platform/src/Http/Controllers/Client/NvrController.php` mantém a workspace operacional em modo degradado controlado quando o contexto oficial já foi validado, evitando fatal error.
7. `scripts/check-official-nvr-sso-runtime.php`, `scripts/test.sh` e `scripts/test-regression.sh` agora validam o smoke HTTP real do portal → `/nvr`.

## Observações operacionais
- O bundle entregue passou a carregar `NVR_SHARED_SECRET` sincronizado em `portal/.env` e `platform/.env` para permitir auditoria objetiva do launch oficial no próprio pacote.
- Esse segredo deve ser rotacionado no ambiente produtivo final.

## Resultado esperado
- `GET /nvr` não retorna 500.
- `GET /nvr/launch.php?ticket=...` com ticket inválido falha fechado.
- `GET /nvr/launch.php?ticket=...` com ticket oficial válido autentica a sessão integrada e abre a workspace do NVR sem 500.
- `/nvr/login` não compete com o fluxo do portal.
- `/nvr/login-tecnico` permanece isolado como contingência administrativa explícita.
