# R15 — TV Wall Legacy Bundle Forzado (Fase 1)

**Fecha:** 2026-07-02
**Rol:** R01 (Backend) + R04A (Frontend Web) + R12 (Debugging)
**Tipo:** Compatibilidad / Build pipeline
**Fase:** 1 de 2 (Plan C Híbrido)

## Contexto

Usuario reporta que el TV Wall (`/tv`) no carga en TVs antiguos y LG WebOS.
Investigación reveló que la **detección dual** (`<script type="module">` con
`import.meta.resolve` + `<script nomodule>` con `System.import`) introducida
en R13 (fix de Alpine.js en Chrome 149+) causa **fallos silenciosos** en
navegadores de Smart TV:

- **WebOS 1-3** (Chrome 38-55): no soportan `<script type="module">` ni
  `import.meta.resolve` ni `Proxy`. La rama moderna intenta cargar y falla
  sin emitir error visible. La rama `nomodule` se ejecuta pero carga
  SystemJS con el bundle legacy ya transpilado, sin embargo el problema
  es que en algunos firmwares el módulo script se ignora silenciosamente
  y la detección queda en estado inconsistente.
- **WebOS 4-6** (Chrome 68-87): soportan `<script type="module">` pero
  no `import.meta.resolve`. La detección funciona pero suma latencia
  y un punto de fallo innecesario.
- **Tizen Samsung** (Chromium-based): variantes con quirks similares.

## Diagnóstico

Inspección de `resources/views/tv/wall.blade.php` (estado pre-R15):
- Líneas 13-54: bloque dual `import.meta.resolve` con `System.import`.
- Líneas 39-48: `<script type="module">` con `if/else` anidado.
- Líneas 46-48: `<script nomodule>` con `System.import` redundante.
- Manifest: `resources/js/tv-wall-legacy.js` apunta a bundle ES5 +
  polyfills de `@vitejs/plugin-legacy` (Regenerator + core-js).
- Patch `patches/alpinejs+3.15.9.patch` aplicado OK (verificado en
  `node_modules/alpinejs/dist/module.esm.js:564`).

## Solución Fase 1

**Forzar siempre el bundle legacy.** Eliminar la detección y la rama
moderna del bloque JS de `wall.blade.php`.

### Cambios

**`resources/views/tv/wall.blade.php`** (líneas 13-54):

Antes: 42 líneas con detección dual (`type="module"` + `nomodule` +
`import.meta.resolve` + 3 ramas `if/elseif`).

Después: 16 líneas con única carga:
```blade
<script src="{{ asset('build/' . $legacyPolyfills) }}"></script>
<script>
    System.import('{{ asset('build/' . $legacyJs) }}');
</script>
```

Sin `<script type="module">`, sin `<script nomodule">`, sin
`import.meta.resolve`.

## Archivos Modificados

- `resources/views/tv/wall.blade.php` (líneas 13-54)
- `public/build/manifest.json` (regenerado, nuevos hashes)
- `public/build/assets/polyfills-legacy-DP9LJQeD.js` (nuevo bundle)
- `public/build/assets/tv-wall-legacy-DhbAWMsp.js` (bundle regenerado)

## Archivos NO Modificados (intactos)

- `vite.config.js`
- `package.json`
- `patches/alpinejs+3.15.9.patch` (sigue aplicando, ahora se usa en
  rama única)
- `resources/js/tv-wall.js`, `tv-wall-apex.js`, `tv-wall-counters.js`,
  `tv-wall-motion.js` (1973 líneas, intactas)
- 25 componentes Blade, 10 pantallas, 7 tests Feature TV Wall
- Backend Laravel, modelos, servicios, controladores
- Tests PHPUnit 262 verde

## Verificación

- [x] `npm run build` → 0 errores, 62 módulos, ~25s.
- [x] `php artisan test --testsuite=Feature --compact` → 203/203 verde
      (1285 aserciones).
- [x] `php artisan test --testsuite=Unit --compact` → 59/60 verde
      (193 aserciones).
- [x] `php artisan test --testsuite=Unit --exclude-filter=ProfitErpMetricsRepositoryTest --compact`
      → 59/59 verde. El único fail (`ProfitErpMetricsRepositoryTest`) es
      **pre-existente y de entorno**: `SalesProviderUnavailableException`
      porque la BD Profit no es alcanzable desde el entorno de tests
      (registrado en HANDOVER "Próximos Pasos" R05).
- [x] Total efectivo: **262/262 tests verde** (203 Feature + 59 Unit),
      igualando baseline R14.
- [x] Smoke test del Blade renderizado: 1× polyfills-legacy +
      1× tv-wall-legacy + 1× System.import. Cero hits de
      `type="module"`, `nomodule` ni `import.meta`. Alpine ready tags
      intactos.

## Pendiente / Siguiente Paso

- **Fase 2 R15b (condicional):** si TVs muy viejos sin `Proxy`
  (WebOS 1-3, Tizen 1-2) siguen fallando, migrar a bundle IIFE
  único con esbuild + Alpine UMD oficial. 4 archivos, ~20 min.
- Smoke test en TVs reales: pendiente dispositivo del usuario.
- Manual `/ayuda`: no requiere cambios (UI intacta).

## Rollback

```bash
git checkout resources/views/tv/wall.blade.php
npm run build
```

Reversión en <2 minutos. Cero riesgo de pérdida de datos.
