Qiiub POS · Task 11 · B2 — Mockup para revisión

LockScreen — reanudar el turno con PIN, sin revelar quién

Created: 2026-06-23 | Last Updated: 2026-06-23

Solo en modo personal (un cajero dueño del terminal). Tras 3 min de inactividad, la máquina hace Active → Locked cuando idlePolicy.lockWithResume = true. El lock ocluye por completo la venta debajo y pide PIN para volver a Active. Pantalla de superficie de auth → revisión de seguridad + fidelidad antes de escribir JSX.

recomendado Lock anónimo

Ni nombre, ni avatar, ni iniciales, ni «último acceso». Quien camine al terminal no aprende quién está detrás del lock. El PIN tecleado se valida contra el dueño de la sesión bloqueada — acierto reanuda, fallo cae al mensaje uniforme.

QQiiub POS Terminal 01 · Farmacia Centro
Sesión bloqueada
Ingresa tu PIN para continuar
PIN · 4 dígitos
1
2
3
4
5
6
7
8
9
Limpiar
0
¿No eres tú? Cerrar sesión ¿Olvidaste tu PIN? Pregunta al gerente

Fallo al reanudar — copy uniforme

Un solo mensaje. No distingue «PIN incorrecto», «no es tu sesión» (otro empleado intentando reanudar), ni «cuenta bloqueada». Sin contador de intentos. Mismo oráculo cerrado que B1, mismo servicio (PinAuthService con decoy PBKDF2 — defensa de timing heredada).

QQiiub POS BloqueadoTerminal 01
Sesión bloqueada
Ingresa tu PIN para continuar
No pudimos verificarte
Revisa tu PIN e intenta de nuevo. ¿Problemas? Pregunta al gerente.
1
2
3
4
5
6
7
8
9
Limpiar
0
¿No eres tú? Cerrar sesión

rechazado Lock con nombre

El patrón convencional «Hola de nuevo, María». Cómodo, pero filtra la identidad del cajero bloqueado a cualquiera que camine al terminal. Rechazado por el criterio de seguridad #3.

No usar
QQiiub POS Terminal 01 · Farmacia Centro
Hola de nuevo, María
Ingresa tu PIN para volver a tu turno
MG
María García
Cajero · activa desde 14:02
Avatar, nombre, rol y hora — todo filtrado

Lo que NO se muestra (por seguridad)

Ausencias deliberadas — el contraste con el lock anónimo de la izquierda.

Nombre / avatar / iniciales del dueño — el lock es anónimo. Quien se acerque no sabe quién está logueado (criterio #3).
Datos de la venta en curso — el stage es opaco y cubre todo: ni total, ni carrito, ni cliente, ni último ítem escaneado (criterio #1).
«PIN incorrecto» vs «no es tu sesión» — un solo mensaje uniforme; no es un oráculo (criterio #2).
«2 intentos restantes» / «cuenta bloqueada» — sin contador, sin estado de lockeo (lo maneja PH2a en silencio, como en B1).
Cuenta regresiva de auto-cierre — el lock que sigue inactivo cae a IdentifyGate (cierra la sesión), pero sin temporizador visible: un contador es también una fuga de información.

Mapa de revisión de seguridad (lo que pediste auditar)

1Sin datos de la sesión detrás del lock. El stage es un overlay opaco a pantalla completa (gradiente sólido, sin transparencia sobre la venta). No hay scrim translúcido que deje «espiar» el carrito o el total. La venta sigue viva en memoria, pero invisible hasta reanudar. ✓
2El resume con PIN no distingue estados de fallo. «No pudimos verificarte / Revisa tu PIN» — idéntico para PIN incorrecto, PIN de otro empleado, o cuenta bloqueada. Sin contador. Mismo servicio que B1 (PinAuthService, decoy PBKDF2 → defensa de timing heredada, no reimplementada). ✓
3Sin fuga de identidad del cajero bloqueado. Lock anónimo: ni nombre, ni avatar, ni rol, ni «activa desde». El topbar muestra solo el terminal. La variante con nombre (izquierda abajo) está marcada «No usar». ✓
+«Cerrar sesión» es la salida del takeover. Si llega otro empleado, no reanuda la sesión ajena: cierra y va a IdentifyGate (re-identificación completa). Es el evento logout de la máquina. La auditoría Logout se atribuye al dueño de la sesión con reason='explicit' (invariante BUG-010), no a quien presiona el botón. ✓
Notas de implementación (no son UI): la máquina Active → idle → Locked requiere mode==='personal' + idlePolicy.lockWithResume; reanudar es Locked → resume → Active vía PinAuthService.resume(pin) contra el empleado dueño; «Cerrar sesión» es dispatch('logout') → IdentifyGate; el lock que sigue inactivo es Locked → idle → IdentifyGate. Todo el copy va por i18next (ES mostrado; EN espejo de igual calidad). Tokens: brand #930EA5, gold POS #FFD700, Poppins/Inter/JetBrains Mono.