Bitácora TV: registrar cuando la pantalla estuvo congelada u oculta

Caso real resuelto con la bitácora (23/08, 12:11): tres rellamados de E001,
el del medio no sonó. No fue la voz: la pestaña que anunciaba estaba en
segundo plano —era el Mac de pruebas, no el televisor; lo delata la voz
Paulina— y Chrome frena los relojes de las pestañas ocultas a ~1 tic por
minuto. En ese hueco el llamado intermedio fue invisible: cuando la pestaña
volvió a consultar, el servidor ya solo mostraba el estado más reciente.

Para que ese estado deje de confundirse con un fallo de la voz, la pantalla
registra ahora el evento 'lag' cuando detecta un hueco de más de 10 s entre
tics o cuando pasa a segundo plano, y la tarjeta de Actividad lo traduce como
«Pantalla congelada» con su explicación.

En el televisor real —siempre visible, en primer plano— este estado no debe
aparecer; si aparece, es la señal de que alguien lo dejó oculto o el equipo
se suspendió.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-23 12:14:19 -05:00
co-authored by Claude Fable 5
parent ec9f9f3a7d
commit 6e5aa16c29
4 changed files with 18 additions and 2 deletions
+1 -1
View File
@@ -26,7 +26,7 @@ $d = json_decode($raw, true);
if (!is_array($d)) exit;
$evento = $d['e'] ?? '';
$PERMITIDOS = ['start', 'end', 'error', 'sin_start', 'mudo'];
$PERMITIDOS = ['start', 'end', 'error', 'sin_start', 'mudo', 'lag'];
if (!in_array($evento, $PERMITIDOS, true)) exit;
unset($d['e'], $d['t']); // el timestamp lo pone la base, no el cliente
+15
View File
@@ -667,6 +667,21 @@ const _uttAncladas = new Set();
// handlers no deben hacer nada más que soltar el anclaje.
let _vozGen = 0;
// Vigía de congelamiento: Chrome frena los relojes de una pestaña oculta a ~1
// tic por minuto. En ese estado la pantalla NO VE los llamados intermedios y
// no anuncia — y desde afuera parece un fallo de la voz. Si entre dos tics
// pasan más de 10 s, se deja constancia con el tamaño del hueco.
let _ultimoTic = Date.now();
setInterval(() => {
const ahora = Date.now();
const hueco = ahora - _ultimoTic;
_ultimoTic = ahora;
if (hueco > 10000) vozLog('lag', { gap_s: Math.round(hueco / 1000) });
}, 2000);
document.addEventListener('visibilitychange', () => {
if (document.hidden) vozLog('lag', { oculta: 1 });
});
// ── Bitácora de la voz ──
// Los fallos intermitentes no se pueden depurar mirando la pantalla: hay que
// registrarlos cuando ocurren. Cada evento va a un anillo local (últimos 200,