# Runtime interno do produto NVR

Este diretório não deve ser tratado como um portal autônomo. Ele representa o **runtime interno do produto NVR**, publicado pelo **portal principal** em `/nvr`.

## Papel desta camada

Mantém apenas o domínio operacional do NVR:

- monitoramento ao vivo;
- catálogo de gravações, reprodução, download, snapshot e exportação;
- acesso remoto mediado;
- gateways, heartbeats, sync e licenciamento;
- telas operacionais e administrativas do próprio produto.

## O que fica no portal principal

Permanece no `portal/` da base principal:

- autenticação do usuário final;
- catálogo e dashboard principal;
- cobrança, assinaturas, trials e contexto comercial;
- launch policy, assinatura de ticket e entitlement;
- navegação principal do cliente e da administração central.

## Comportamento de entrada

- entrada pública obrigatória: **`/public/nvr`** no portal;
- consumo principal: **`/nvr/launch.php`** por ticket assinado;
- acesso direto ao runtime sem contexto do portal deve falhar fechado e redirecionar ao portal oficial;
- `GET /login`, `GET /login-central` e `GET /sso/entrar` não são portas principais válidas do usuário final neste modo;
- login local permanece apenas como contingência técnica explícita, pela rota dedicada `/login-tecnico`;
- query params ou POST genéricos não reabrem o fallback técnico fora dessa rota;
- sessões do workspace NVR só são aceitas quando nascem de `portal_launch` válido ou de contingência técnica auditável.

## Runtime web desta rodada

- **Laravel nativo** como camada web principal;
- `artisan` e `public/index.php` apontam apenas para o bootstrap Laravel;
- rotas HTTP canônicas em `routes/web.canonical.php` usando `Route` do Laravel, sem `web.generated.php` ou `routes/legacy.php` no runtime principal;
- artefatos híbridos legados foram arquivados em `compatibility/legacy-runtime/`, fora do boot principal e fora do autoload canônico.
- console, migrations, factories e seeders passam pelo ciclo nativo do Artisan.


## Materialização do runtime no bundle final

- `composer.lock` passa a acompanhar o app interno em `/platform`;
- o diretório `vendor/` agora carrega o **runtime materializado auditável** entregue junto do pacote;
- `scripts/ensure-laravel-vendor.sh` valida o bundle local e não usa mais `composer install` como caminho principal;
- a checagem objetiva desta rodada é `php artisan about` e `php artisan route:list` executando diretamente no pacote entregue, sem rede.
- o pacote não expõe mais container/router/request/response legados no caminho principal.

## Banco central oficial

- engine oficial: **MariaDB/MySQL**;
- contrato do ambiente: `DB_CONNECTION=mysql`, `DB_PORT=3306`, `DB_CHARSET=utf8mb4`, `DB_COLLATION=utf8mb4_unicode_ci`, `DB_SESSION_TIMEZONE=+00:00`;
- `mariadb` é aceito apenas como alias de compatibilidade;
- o runtime central mantém MariaDB/MySQL como baseline oficial;
- o `/gateway` pode manter SQLite local apenas para metadados operacionais.

## Referências desta rodada

- `docs/ARQUITETURA_PLATFORM_A03.md`
- `docs/MODULO_11_LARAVEL_NATIVO.md`
- `docs/MODULO_12_CONSOLE_MIGRATIONS_SEEDERS.md`

## Console e inicialização de banco

- baseline limpo: `php artisan migrate:fresh --seed`;
- seed formal de desenvolvimento: `php artisan db:seed --class="Database\\Seeders\\DevelopmentDatabaseSeeder"`;
- seed core: `php artisan db:seed`;
- `scripts/seed-dev.php` agora delega ao console nativo do Laravel, sem bootstrap manual de SQL/PDO.

## Entrada oficial, SSO e contingência técnica

- o fluxo principal do usuário final entra pelo **portal oficial**;
- o launch do NVR consome **ticket temporário assinado** em `/launch.php` sob o subpath `/nvr`;
- acesso direto sem contexto válido do portal falha fechado;
- o fallback local continua disponível apenas por **`/login-tecnico`**, para contingência administrativa explícita;
- o fallback legado por `token` direto permanece bloqueado por padrão e só pode ser reabilitado por configuração interna controlada.

