# review-mockup — E250-C0098 (intranet de super-admin de plataforma)

Review fría (subagente sin sesgo de anclaje; no construyó los mockups). Se evaluaron las 5 superficies + las 2 variantes del wizard contra: coherencia con el shell real (`PanelView.vue` / `PanelPlatformSelectorView.vue`, tema `e250`), uso semántico de DaisyUI, intención del change (contrato + `example-map.md`, reglas INT-A1…INT-F2 + INT-VOCAB), y marca de mockup.

**Eje wizard — aprobada: `v2b-wizard-paginas.html`.**
**Motivo:** páginas separadas comunican "para y retoma cuando quieras" (coherente con R3, alta parable/retomable) y escalan cuando un paso crece; el stepper único de v2a comunica "complétalo de una sentada", lo contrario de lo que el producto permite. Se honra la decisión humana ya tomada; v2a queda como alternativa documentada (rol equivalente a v3a en C0097). No se detectó defecto bloqueante de layout en v2b.

Las otras 4 superficies (v1 home, v3 usuarios/super-admins, v4 archivar, v5 espacio archivado) ya venían aprobadas por el humano; se revisan igualmente y se confirman salvo los findings de copy abajo.

## Coherencia global con el shell real (todas las variantes)

- ✅ `data-theme="e250"` con los tokens OKLCH reales del tema (`primary` verde #2eac66, `secondary` #02703c, `accent` #228ed0) inlined; coincide con `tailwind.config.js`.
- ✅ Esqueleto idéntico al de `PanelView.vue`: `min-h-screen bg-base-200 text-base-content flex flex-col`, sidebar `w-6x bg-base-100 border-r border-base-300`, header `h-14` con breadcrumb, banda persistente de ancho completo estilo PAN-17 (v5 usa `bg-neutral`, el panel usa `bg-secondary` para staff-mode — variación de color justificada por semántica "archivado").
- ✅ Grupo "Plataforma" con badge `STAFF-ONLY` (v1) replica el `panel-group-platform` real. Selector global en v5 replica el patrón `ul divide-y` + `name` / `orgName` de `PanelPlatformSelectorView.vue`.
- ✅ DaisyUI semántico en todas: `btn`, `card`, `modal`, `alert`, `badge`, `steps`, `table`, `select`, `input`, `form-control`, `tooltip`. Sin librería UI ajena; Tailwind crudo sólo para layout. CDN de Tailwind + DaisyUI 4.12.24 (correcto para mockup estático, ver NOTES.md).
- ✅ Marca de mockup presente en las 6: comentario HTML de cabecera + banner `bg-warning` superior + badge "MOCKUP — no producción" en el header.

## Findings por variante

### v1-home-intranet.html (aprobada por humano)
- ✅ INT-B1 cubierto: org "Nautic Tours" sin espacios como estado válido explícito. Distingue claramente superficie de plataforma vs panel de operador. Espacio archivado ("Destino Sur") marcado y con acción "Inspeccionar" en vez de "Abrir". Sin findings de VOCAB.
- [ ] Menor (cosmético, no bloqueante): sidebar `w-64` vs `w-60` del panel real; alinear al construir.

### v2a-wizard-stepper.html (alternativa documentada, NO elegida)
- [ ] **VOCAB (texto visible):** línea 47 — "Guardaste la **organization** el 1 jul". Debe decir "organización". Fix: cambiar "organization" → "organización". No bloquea la promoción (v2b es la elegida), pero corregir si alguna vez se revive v2a.
- ✅ Resto correcto: INT-B2/R2 (owner por email obligatorio en el mismo paso, aviso de "nunca 0 owners"), R3 (Guardar y salir / continuar, banner de borrador retomado).

### v2b-wizard-paginas.html (APROBADA — eje wizard)
- ✅ INT-B1/B2/B3 reflejados: pasos como páginas (org ✓ / espacio+owner ✓ / usuarios en curso), owner ya persistido y confirmado (`ana@operadorx.com`), usuarios aplazables ("Los usuarios son aplazables — puedes retomar desde la ficha del espacio", "Guardar y salir", "Finalizar alta"), alta de usuario por email + rol (admin/editor/viewer, sin "owner" en la fila de alta — correcto, no se crea 2º owner por aquí).
- ✅ VOCAB limpio.
- [ ] Menor (coverage, no bloqueante): la superficie concreta de INT-B2 "owner obligatorio en el mismo paso al crear el espacio" (formulario con validación) sólo se ve mockeada en v2a (paso 2); v2b la representa como paso completado (✓ Espacio + owner). Es correcto por diseño (v2b muestra el paso "usuarios"), pero al construir, la página de creación de espacio debe portar la validación owner-obligatorio que ilustra v2a.

### v3-gestion-usuarios-superadmins.html (aprobada por humano)
- ✅ INT-C1: invitar email nuevo como platform-admin → identidad sin membresía (`nuevo@turitop.com`, fila "invitado · sin membresía"); sección de invitar/promover explica "se crea la identidad sin membresía y con el flag".
- ✅ INT-C3 anti-lockout: no quitarte tu propio flag (botón `disabled` + tooltip en `vs@`); alert explícita "no puedes revocar el último super-admin".
- ✅ INT-E2 invariante un-owner: `ana@` único owner de "Destino Norte" con guard (select de rol `disabled` + "Quitar" `disabled` + "Reasignar owner a otro miembro…"), replicado en la lista y en el modal de edición. Añadir/quitar/mover membresías presente. Emails normalizados mencionados. Sin findings de VOCAB.

### v4-archivar-confirmacion.html (aprobada por humano)
- [ ] **VOCAB (texto visible) — a corregir:** línea 68 — encabezado del modal "🗄️ Archivar **organization** «Operador X»". Debe decir "organización". Es una **incoherencia dentro del mismo modal**: el botón de confirmar (línea 89) ya dice "Archivar **organización** y sus 2 espacios". Fix: "organization" → "organización" en el `<h3>`. Único incumplimiento de INT-VOCAB en texto visible sobre una superficie aprobada; debe corregirse antes de que build-frontend arrastre el copy.
- ✅ INT-D2 por lo demás correcto: confirmación fuerte por nombre exacto (caso espacio con texto que no coincide → botón `disabled`; caso org con texto que coincide → habilitado), cascada de org con arrastre agregado + lista de espacios y reservas, nota de que aplica a El Cardón sin excepción.

### v5-espacio-archivado-inspeccion.html (aprobada por humano)
- ✅ INT-D4: banda persistente "archivado · sólo inspección"; muestra SÓLO config persistida (nombre, organización, usuarios/membresías, integraciones **configuradas** con nota "no ejercitado — no se llama a OCTO"); reservas/disponibilidad representadas como "no disponible en modo inspección" con explicación de que se leen en vivo de OCTO y por eso no se cargan; acciones de operación `disabled`. Buen detalle: refleja la asimetría OCTO real del cliente (Volcano Teide `capabilities: pricing`, TuriTop `(ninguna)`).
- ✅ INT-D5: botón "↻ Reactivar" de un clic en la banda (sin confirmación fuerte, coherente con R7). Marca "🗄️ archivado" en el selector global del staff, con acción "inspeccionar" en vez de abrir. Membresías "no se borran mientras archivado" explicitado. `v5:50` contiene "organization" pero es un **comentario HTML** (código, permitido por INT-VOCAB) — no es finding.

## Veredicto

**Wizard: aprobado `v2b-wizard-paginas.html`.** El plan puede promoverse.

Superficies v1/v3/v5: aprobadas sin findings bloqueantes (sólo el ajuste cosmético de ancho de sidebar en v1).

**Findings de INT-VOCAB a resolver antes de construir (build-frontend no debe arrastrarlos):**
1. **v4 línea 68** (superficie aprobada): "organization" → "organización" en el encabezado del modal. Incoherente con su propio botón. Corrección obligatoria.
2. **v2a línea 47** (alternativa no elegida): "organization" → "organización". Corregir sólo si se revive v2a; no bloquea la promoción.

Ningún finding bloquea la promoción del plan ni reabre decisiones de producto. Los dos VOCAB son correcciones de copy triviales; el de v4 debe aplicarse porque vive en una superficie aprobada.
