Investigación y documentación

Documentación · COMAL

21 archivos markdown del case de estudio (producto, UX research, IA, flujos, design system, handoff…).

En esta página Referencia Paper — COMAL 0%

00-paper-reference.md

Abrir documento

Referencia Paper — COMAL

CampoValor
File ID01KYX2GFM9EGHF4EG0AQZJPZ5G
URLhttps://app.paper.design/file/01KYX2GFM9EGHF4EG0AQZJPZ5G
Nombre del archivoCOMAL — Daily UX 2026-07-31
Fecha de creación2026-07-31
Cierre UX/UI2026-08-01
Estado UICompleto46 artboards UI/UX + 7 etiquetas de sección (canvas jerárquico)

Mapa del canvas (bandas verticales, CRON §5.2)

Lectura arriba → abajo. Etiquetas §N encima de cada banda.

§BandaContenido
1UX PROCESSUX-00 … UX-10 (2 filas)
2DESIGN SYSTEM + DESKTOP00 DS · Landing · Landing ops · Explorar desktop
3MOBILE — AUTHLogin · Registro · Recuperar · Email · Onboarding
4MOBILE — BOOKING FLOWExplorar · Detalle · Reserva · Checkout · Confirmación · Check-in
5MOBILE — ACCOUNTReservas · Detalle · Cancelar · Perfil · Planes · Notif · Facturas
6OPS / STAFFOp-01 … Op-05
7SYSTEM STATESEmpty · Loading · errores de pago/sesión/validación/red

Inventario completo de artboards — UI producto

#ArtboardDispositivoContenido
00Design System1440×1200Tokens, botones, chips, slots
01Landing — Desktop1440×900Captación cocineros
01bLanding operadores1440×900Captación operadores
02Auth — Login390×844Entrada
02bRecuperar contraseña390×844Solicitud de enlace
02cEmail enviado390×844Confirmación envío
03Auth — Registro390×844Alta cocinero/operador
04Onboarding390×844Equipos y ciudad
05Explorar — Mobile390×844Listado + filtros + nav
06Detalle cocina390×844Ficha + CTA sticky
07Reserva — Calendario390×844Fecha, estación, slots
08bCheckout — Pago390×844Resumen + tarjeta
08Confirmación390×844Éxito post-pago
09Mis reservas390×844Próximas + historial
09bDetalle reserva390×844Acciones + cancelar
09cCancelar reserva390×844Sheet confirmación
10Check-in390×844QR + PIN dark
11Perfil y membresía390×844Cuenta y plan
11bPlanes membresía390×844PayGo / Base / Pro
11cNotificaciones390×844Toggles preferencias
11dFacturas y pagos390×844Métodos + historial
12Explorar — Desktop1440×900Filtros + grid
13Empty — Sin resultados390×844Filtros vacíos
14Error — Pago fallido390×844Hold + reintento
15Loading — Explorar390×844Skeletons
16Empty — Sin reservas390×844Primera vez
17Sesión expirada390×844Re-login
18Error validación login390×844Email inválido
19Reserva — Sin huecos390×844Día lleno
20Error de red390×844Offline / reintentar
Op-01Dashboard operador1440×900Día y métricas
Op-02Calendario operador1440×900Semana
Op-03Bloquear franja1440×900Modal bloqueo
Op-04Precios y estaciones1440×900Tabla precios
Op-05Check-in recepción768×1024Tablet PIN

Inventario proceso UX (11) — alineado a markdown del case

ArtboardContenidoDoc fuente
UX-00 Research coverPortada proceso UX industrial
UX-01 StakeholdersMapa influencia × interés02
UX-02 PersonasLucía, Marcos, Elena, Andrés02
UX-03 JTBD3 jobs cocinero/operador02
UX-04 User storiesÉpicas A–D MoSCoW + AC02 / 19
UX-05 Journey mapsLucía reserva + Elena ops02
UX-06 Service blueprintCapas + fallos pago/slot02
UX-07 Site map + IAPúblico · cook · ops03
UX-08 Flujos de usuarioF4 reserva E2E + auth/ops04
UX-09 Modelo datos + rolesER + COOK/OPERATOR05
UX-10 Definición + métricasProblema, valor, north star01

Total: 46 artboards hi-fi en Paper (35 UI + 11 proceso UX).

Media real (2026-08-01)

Fotos fotorrealistas generadas en las cards/heroes de cocinas (no placeholders de color):

Asset localUso en Paper
assets/kitchens/kitchen-hub-vallecas.jpgCard explorar mobile/desktop Kitchen Hub
assets/kitchens/obrador-sur-legazpi.jpgCard explorar Obrador Sur
assets/kitchens/cocina-abatidor.jpgCard desktop Fogón Centro
assets/kitchens/hero-kitchen-hub.jpgDetalle cocina + hero landing

Insertadas con paper-asset:// (regla permanente del cron: ver CRON.md §5.1).

Design tokens

Definidos en el archivo Paper (CSS variables). Duplicados en 08-design-system.md.

Prototipo y navegación

Ver 17-prototype-map.md.

Auditoría de completitud

Ver 18-completeness-audit.md.

01-project-definition.md

Abrir documento

01 — Definición del proyecto · COMAL

5.1 Identidad

CampoValor
NombreCOMAL
SignificadoDel comal, plancha tradicional de cocina en Mesoamérica: superficie compartida donde se cocina lo esencial. Evoca profesionalidad culinaria, cultura y trabajo colectivo.
EsloganTu cocina profesional, cuando la necesitas.
Una frasePlataforma para reservar y gestionar cocinas certificadas por horas.
Descripción ejecutivaCOMAL conecta emprendedores gastronómicos (food trucks, pasteleros, caterings emergentes) con operadores de cocinas compartidas certificadas. El cocinero descubre espacios por ubicación, equipo y franjas; reserva y paga online; hace check-in digital. El operador gestiona ocupación, precios, reglas sanitarias y cobros. El modelo combina membresía (acceso prioritario y descuentos) con reserva por horas.
SectorAlimentación · Hostelería · Emprendimiento gastronómico
Tipo de productoSistema de reservas + gestión ligera de espacios (PWA)
Plataforma principalProgressive Web App (responsive web-first)
Plataformas secundariasSMS/email transaccional; futuro: app nativa iOS/Android; tablet en recepción del local
Mercado objetivoEspaña (lanzamiento ciudad piloto: Madrid / Barcelona / Valencia) con expansión LATAM hispanohablante
Idioma principal UIEspañol (España)
Otros idiomasEspañol LATAM (variantes de copy); inglés (fase posterior)

5.2 Problema

Problema principal

Los emprendedores gastronómicos sin cocina propia certificada no pueden producir de forma legal, predecible y escalable. Coordinan espacios por WhatsApp, Excel o boca a boca, con conflictos de horarios, falta de trazabilidad sanitaria y pagos informales.

Problemas secundarios

  • Dificultad para demostrar cumplimiento (HACCP, registros de uso) ante inspecciones.
  • Operadores de cocinas con ocupación irregular y cobro manual.
  • Falta de transparencia en equipamiento real disponible por franja.
  • Cancelaciones de última hora sin política clara.
  • Desconfianza en la limpieza y el solapamiento entre usuarios.

Quién lo experimenta

  1. Cocinero emprendedor — produce para venta online, delivery o eventos.
  2. Operador de cocina compartida — dueño o gestor del local.
  3. Indirectamente: clientes finales del emprendedor (calidad/seguridad alimentaria).

Cómo se resuelve hoy (supuesto de mercado)

  • Grupos de WhatsApp y Telegram.
  • Alquiler de cocinas de restaurantes en horario muerto (acuerdos informales).
  • Coworkings gastronómicos con reserva por email/teléfono.
  • Ghost kitchens B2B con contratos largos y precios altos.

Deficiencias de las soluciones actuales (hipótesis)

  • No hay inventario en tiempo real de franjas y equipos.
  • Sin flujo de pago unificado ni facturación automática.
  • Sin evidencia digital de quién usó qué y cuándo.
  • Onboarding del operador lento; del cocinero, opaco.

Coste del problema (supuestos, no medidos)

TipoEstimación cualitativa
HumanoEstrés, jornadas perdidas por cancelaciones
EconómicoHoras no productivas; multas por no conformidad
OperativoDoble agenda, cobros a mano, disputas

Oportunidad de producto

Digitalizar el marketplace de capacidad de cocina certificada con confianza (certificados, reseñas, reglas) y operaciones (calendario, pago, check-in).

Clasificación de evidencias

TipoContenido
Comprobado en esta ejecuciónN/A — no se realizó investigación de campo ni desk research citando fuentes primarias
SupuestosDemanda de cocinas por horas en ciudades grandes; operadores abiertos a comisión 10–15 %
HipótesisLa visibilidad de certificaciones y equipamiento aumenta conversión a primera reserva ≥ 25 % vs. listado opaco
Decisiones de diseñoPWA primero; español ES; foco en 2 roles (Cocinero, Operador); no IA en MVP

5.3 Objetivos

Negocio

  • Alcanzar product-market fit en 1 ciudad piloto en 6 meses.
  • GMV de reservas y tasa de ocupación media de cocinas listadas.
  • Retención de operadores (oferta) y cocineros activos mensuales (demanda).

Usuario (cocinero)

  • Reservar una franja adecuada en < 5 minutos en el primer uso.
  • Confiar en que el espacio está limpio, equipado y certificado.
  • Recibir comprobante y acceso sin fricción el día de la reserva.

Usuario (operador)

  • Ver ocupación del día y huecos en un vistazo.
  • Reducir no-shows y cobros pendientes.
  • Publicar reglas y precios sin intermediación manual constante.

Producto

  • Flujo completo: descubrir → reservar → pagar → check-in → valorar.
  • Panel operador MVP: calendario, precios base, bloqueos, check-in.

Experiencia

  • Claridad industrial: horarios y precios siempre visibles.
  • Reducir ansiedad pre-reserva (qué incluye, qué no, política de cancelación).

Técnicos

  • Disponibilidad 99,5 % en horario comercial.
  • Confirmación de pago < 3 s percibidos tras autorización.
  • WCAG 2.2 AA en flujos críticos.
  • PWA instalable; offline limitado (ver mis reservas cacheadas).

No objetivos (Won’t have por ahora)

  • Marketplace de ingredientes o personal de cocina.
  • IA de planificación de menús.
  • App nativa en v1.
  • Multi-país con compliance fiscal local completo.
  • Reservas de comensales (no es OpenTable).

Restricciones

  • Cumplimiento RGPD; pagos PCI vía PSP (Stripe).
  • No almacenar datos de tarjetas en claro.
  • Contenido legal/sanitario: el operador es responsable de la veracidad de certificados subidos (COMAL verifica de forma ligera en onboarding).

Dependencias

  • Stripe (pagos y suscripciones).
  • Proveedor SMS/email.
  • Mapas (Mapbox o Google) para geolocalización.
  • Identidad (Auth.js / OAuth email + Google).

Riesgos iniciales

RiesgoMitigación
Oferta insuficiente en ciudad pilotoOnboarding concierge de 10–20 cocinas
No-shows altosDepósito / cargo parcial + reputación
Disputas de limpiezaChecklist de salida + fotos + reportes
Regulación local ambiguaCopy que no promete licencia al usuario final; disclaimer

5.4 Métricas

MétricaDefinición
North StarHoras de cocina confirmadas y completadas / semana (completed kitchen-hours)
Activación% de registros que completan 1ª reserva pagada en ≤ 7 días
Conversión listado→reserva% de vistas de ficha que inician checkout
Conversión checkout% de checkouts iniciados que pagan
Retención D30% de cocineros con ≥ 1 reserva en mes 2 si reservaron en mes 1
FrecuenciaReservas / cocinero activo / mes
Finalización de tareaTiempo medio a primera reserva exitosa
AbandonoDrop-off por paso del funnel de reserva
ErroresTasa de fallos de pago y de check-in
SatisfacciónCSAT post-sesión; NPS trimestral
CESEsfuerzo percibido para re-reservar la misma cocina
IngresosTake rate + suscripciones membresía
Costes operativosCoste soporte / reserva completada
Accesibilidad0 issues críticos AA en flujos core (auditoría automatizada + manual)
RendimientoLCP < 2,5 s en 4G mediano en listado y ficha

Roles del producto

RolDescripción
CocineroReserva y usa cocinas
OperadorPublica y gestiona un espacio (o varios)
Admin COMALModeración, soporte L2, verificación de listados (fuera de UI MVP detallada)

02-ux-research-strategy.md

Abrir documento

02 — Investigación UX y estrategia · COMAL

Nota metodológica: No se realizó investigación primaria en esta ejecución. Los perfiles, JTBD y journeys son constructos de diseño basados en supuestos documentados. Antes de implementar, validar con entrevistas y observación en cocinas compartidas reales.


6.1 Stakeholders

StakeholderInfluenciaInterésNecesidadesRiesgosRelación
Product Owner COMALAltaAltaPMF, ingresos, marcaScope creepPropietario
Cocinero emprendedorMediaAltaReserva fiable, precio claroAbandono si fricciónUsuario principal
Operador de cocinaAlta (oferta)AltaOcupación, cobro, menos soporteChurn si take rate altoUsuario + partner
Soporte COMALMediaMediaCasos claros, herramientasColapso en disputasOperador interno
Legal / ComplianceAltaMediaRGPD, términos, disclaimers sanitariosMultas, reputaciónGatekeeper
Seguridad / Seguridad de pagoAltaMediaPCI, fraude, acceso físicoIncidentesGatekeeper
PSP (Stripe)MediaBajaIntegración correctaDowntime pagosDependencia
Autoridad sanitaria (local)Alta situacionalBajaCumplimiento localesCierre de cocina listadaExterno / regulador
Cliente final del cocineroBajaBajaInocuidad alimentariaDaño reputacional cascadaIndirecto

6.2 Perfiles de usuario

Perfil 1 — Lucía “Food truck” (Cocinera)

CampoDetalle
RolEmprendedora gastronómica, food truck de tacos
Edad32
ContextoProduce 3–4 días/semana; no tiene local propio; necesita cocina con freidora y abatidor
Experiencia digitalMedia-alta (apps de delivery, Instagram, banca móvil)
MotivacionesCumplir normativa; escalar pedidos sin mudarse a un local fijo
NecesidadesFranjas predecibles, freidora industrial, parking cercano, factura
ObjetivosReservar 12–16 h/semana fijas + puntuales de pico
FrustracionesWhatsApp sin respuesta; cocinas que “no tienen lo que prometen”
LimitacionesPresupuesto ajustado; madrugones; no puede perder un sábado de evento
ComportamientosReserva en el móvil entre servicios; relee políticas de cancelación
DispositivosiPhone 13; a veces portátil en casa
Entorno de usoMóvil con grasa en las manos (guantes o toallitas); conexión 4G
AccesibilidadPrefiere botones grandes; contraste alto en exterior soleado
Cita«Si no puedo confirmar la freidora, no reservo.»
EscenarioJueves 22:00: ve pico de pedidos para el sábado y necesita 6 h extras el viernes 05:00–11:00

Perfil 2 — Marcos “Pastelería B2B” (Cocinero)

CampoDetalle
RolPastelero casero profesionalizando venta a cafeterías
Edad41
ContextoHorarios nocturnos; necesita horno de convección y obrador limpio
Experiencia digitalMedia
MotivacionesLegalizar producción; dejar de cocinar en casa
NecesidadesSilencio nocturno permitido; almacenamiento en frío opcional; membresía
ObjetivosTurno fijo martes y jueves 22:00–04:00
FrustracionesContratos rígidos de 20 h mínimas; depósitos opacos
LimitacionesPoca paciencia con jerga tech; prefiere español claro
DispositivosAndroid mid-range; Chrome
EntornoCasa por la noche; tablet del hijo a veces
AccesibilidadLectura de 16px mínimo; evita captchas difíciles
Cita«Dime el precio final con IVA y ya.»
EscenarioQuiere membresía “Nocturna” y bloquear franjas recurrentes

Perfil 3 — Elena “Kitchen Hub” (Operadora)

CampoDetalle
RolGestora de cocina compartida de 4 estaciones en polígono industrial
Edad38
ContextoGestiona limpieza, llaves, turnos y cobros; tiene un empleado a media jornada
Experiencia digitalAlta (Excel, TPV, email)
MotivacionesSubir ocupación del 45 % al 70 %; menos mensajes a las 23:00
NecesidadesCalendario unificado; check-in; reportes de ingresos; bloqueos por mantenimiento
ObjetivosMenos no-shows; facturación automática
FrustracionesDoble reserva por error humano; pagos en efectivo
DispositivosMacBook + iPad en recepción
EntornoOficina del local; ruido de extractores
AccesibilidadNinguna especial
Cita«Si el sistema no me dice quién entra a las 6, no me sirve.»
EscenarioLunes 08:00: revisa ocupación de la semana y bloquea estación 2 por avería del horno

Perfil 4 — Andrés “Soporte COMAL” (secundario)

CampoDetalle
RolAgente de soporte L1
ContextoResuelve disputas de cancelación y fallos de check-in
NecesidadesTimeline de reserva, logs de pago, estado de acceso
Cita«Necesito el ID de reserva y el estado del pago en una pantalla.»

6.3 Jobs To Be Done

JTBD 1 — Cocinero, reserva puntual

Cuando me sale un pedido grande o un evento, quiero asegurar una cocina certificada con el equipo que necesito en una franja concreta, para poder producir sin incumplir la normativa ni improvisar a última hora.

DimensiónDetalle
FuncionalEncontrar y pagar franja con equipo X
EmocionalReducir ansiedad de “no tener dónde cocinar”
SocialSer percibido como profesional serio ante clientes B2B
DisparadorPico de demanda o inspección pendiente
ResultadoConfirmación + acceso el día D
BarrerasPrecio, distancia, desconfianza limpieza
AlternativasWhatsApp a conocidos; cocinar en casa (ilegal en muchos casos)

JTBD 2 — Cocinero, hábito recurrente

Cuando ya sé mis días de producción, quiero fijar turnos recurrentes con descuento de membresía, para planificar stock y personal sin renegociar cada semana.

JTBD 3 — Operador, ocupación

Cuando abro la semana, quiero ver huecos y cobros pendientes de un vistazo, para llenar franjas y cobrar sin perseguir a nadie.


6.4 Historias de usuario (por épicas)

Épica A — Descubrimiento y ficha

IDHistoriaPrioridadMoSCoW
A1Como cocinero, quiero filtrar cocinas por ciudad, precio/h y equipo, para acotar opciones útilesAltaMust
A2Como cocinero, quiero ver certificaciones y fotos reales, para confiar antes de pagarAltaMust
A3Como cocinero, quiero leer la política de cancelación en la ficha, para evitar sorpresasAltaMust

A1 — Criterios de aceptación

  • Filtros: ciudad/barrio, rango €/h, equipos (multi-select), franja horaria, valoración mínima.
  • Resultados actualizan en < 1 s percibido o muestran skeleton.
  • Contador de resultados visible.
  • Sin resultados → empty state con sugerencia de ampliar filtros.

Dependencias: catálogo de equipos normalizado.
Errores: fallo de red → reintentar.
Métrica: CTR ficha desde listado.

Épica B — Reserva y pago

IDHistoriaPrioridadMoSCoW
B1Como cocinero, quiero elegir fecha y franjas de 1 h, para reservar solo lo necesarioAltaMust
B2Como cocinero, quiero ver precio desglosado (base, tasas, descuento membresía), para pagar con claridadAltaMust
B3Como cocinero, quiero pagar con tarjeta y recibir confirmación, para tener comprobanteAltaMust
B4Como cocinero, quiero cancelar según política, para recuperar parte del importe si aplicaMediaShould

B1 — Criterios de aceptación

  • Slots de 1 h; selección continua (no huecos en medio en la misma reserva).
  • Slots ocupados deshabilitados con razón tooltip (“Reservado” / “Bloqueado”).
  • Mínimo 2 h por reserva (configurable por cocina) — decisión de diseño.
  • Zona horaria Europe/Madrid explícita.

Épica C — Check-in y sesión

IDHistoriaPrioridadMoSCoW
C1Como cocinero, quiero un código QR/PIN el día de la reserva, para acceder sin llaves físicasAltaMust
C2Como cocinero, quiero un checklist de salida, para dejar constancia de limpiezaMediaShould

Épica D — Operador

IDHistoriaPrioridadMoSCoW
D1Como operador, quiero ver el calendario del día por estación, para anticipar llegadasAltaMust
D2Como operador, quiero bloquear franjas por mantenimiento, para evitar reservas inválidasAltaMust
D3Como operador, quiero exportar ingresos del mes, para contabilidadMediaShould

Épica E — Cuenta y membresía

IDHistoriaPrioridadMoSCoW
E1Como cocinero, quiero registrarme con email, para guardar reservasAltaMust
E2Como cocinero, quiero contratar plan “Base” o “Pro”, para descuentos y prioridadMediaShould
E3Como usuario, quiero exportar/borrar mis datos, para ejercer derechos RGPDAltaMust

Won’t have por ahora

  • Reservas de personal de cocina.
  • Chat in-app entre cocinero y operador (usar email/teléfono del listado).
  • IA de sugerencia de horarios.

6.5 Journey map — Lucía: primera reserva de emergencia

FaseAccionesPensamientosEmocionesTouchpointsProblemasOportunidadesMétricasResponsable
DescubrimientoBusca “cocina compartida Madrid” / ve anuncio“¿Será fiable?”EscepticismoSEO, ads, IGMarca desconocidaPrueba social en landingCTR landingGrowth
ExploraciónFiltra freidora + mañana“¿Hay hueco viernes?”UrgenciaListado PWAFiltros confusosChips de equipo clarosFiltros usadosProduct
EvaluaciónAbre ficha, lee reviews“¿Está limpia?”DudaFichaFotos stockFotos reales + cert.Tiempo en fichaDesign
ReservaElige 05–11, ve precio“Es caro pero no hay otra”TensiónCalendarioPrecio sorpresaDesglose transparenteInicio checkoutProduct
PagoPaga con tarjeta“Que no falle”AnsiedadStripe sheetError tarjetaReintento + soportePago OK %Eng
ConfirmaciónGuarda PDF/ICS“Listo”AlivioEmail + appEmail spamPush/PWAOpen rateOps
UsoCheck-in 04:55“¿Funciona el PIN?”NerviosQR/PINWiFi del localPIN offline-capableCheck-in OKOps
CierreChecklist + valora“Volveré si OK”CalmaAppOlvida valorarRecordatorio 2 hCSATProduct

6.6 Service blueprint (reserva completada)

CapaElementos
Acciones usuarioBusca → reserva → paga → llega → check-in → cocina → checkout checklist
FrontstagePWA, email confirmación, pantalla check-in, cartel con WiFi del local
BackstageMatching inventario slots, motor precios, webhooks Stripe, generación PIN
SistemasAPI COMAL, Postgres, Redis locks, Stripe, Twilio/email, (opcional) cerradura smart
SoporteLimpieza programada, operador en recepción, soporte COMAL L1
EvidenciasFactura PDF, ICS, log check-in, fotos checklist
FallosDoble booking (race), pago capturado sin slot, PIN inválido, no-show
RecuperaciónLock optimista + idempotency keys; reembolso automático si fallo post-pago; PIN de respaldo operador; política no-show

Decisiones de investigación pendientes (reales)

  1. Entrevistas con 8–12 cocineros y 5 operadores en ciudad piloto.
  2. Shadowing de un día de cocina compartida.
  3. Benchmark de comisiones y precios/h de mercado local.
  4. Prueba de usabilidad del flujo de reserva (5 usuarios).

03-information-architecture.md

Abrir documento

03 — Arquitectura de información · COMAL

Mapa del sitio

PÚBLICO
├── /                     Landing marketing
├── /como-funciona
├── /precios
├── /para-operadores
├── /cocinas              Explorar (listado)
│   └── /cocinas/:slug    Ficha cocina
├── /entrar
├── /registro
└── /legal
    ├── privacidad
    ├── terminos
    └── cookies

APP COCINERO (auth)
├── /app                  Redirect → explorar o home
├── /app/explorar
├── /app/cocinas/:id
├── /app/reservar/:id     Flujo reserva
├── /app/reservas         Mis reservas
│   └── /app/reservas/:id Detalle + check-in
├── /app/membresia
├── /app/perfil
│   ├── datos
│   ├── pagos
│   ├── notificaciones
│   └── privacidad
└── /app/soporte

APP OPERADOR (auth + rol)
├── /ops                  Dashboard día
├── /ops/calendario
├── /ops/estaciones
├── /ops/precios
├── /ops/bloqueos
├── /ops/reservas
├── /ops/checkin
├── /ops/ingresos
└── /ops/configuracion

Principal (cocinero, bottom nav móvil)

TabDestinoIcono conceptual
ExplorarListadoBrújula / grid
ReservasMis reservasCalendario
AccesoCheck-in activo o próximoQR
PerfilCuentaUsuario

Principal (operador, sidebar desktop)

Dashboard · Calendario · Reservas · Estaciones · Ingresos · Configuración

Secundaria

  • Filtros en explorar (sheet / sidebar)
  • Breadcrumbs en desktop: Explorar / Cocina X / Reservar

Contextual

  • CTA “Reservar” sticky en ficha
  • Acciones en reserva: cancelar, añadir al calendario, contactar operador

Búsqueda

  • Texto libre: nombre de cocina, barrio
  • Filtros facetados: equipo, €/h, horario, valoración, certificados

Taxonomías

Equipos (catálogo cerrado)

Horno convección · Freidora · Plancha · Fogones · Abatidor · Cámara frigorífica · Obrador pastelería · Empaquetado · Lavavajillas industrial · Campana extractora

Certificaciones (etiquetas)

Registro sanitario · Formación manipuladores · Seguro RC · Acceso 24h · Parking · Zona carga

Tipos de espacio

Estación individual · Cocina completa · Obrador · Solo packaging

Inventario de contenido

TipoPropietarioEstadoPrioridadFrecuenciaVisibilidad
Ficha cocinaOperadorPublicadoP0SemanalPúblico
FotosOperadorModeradoP0MensualPúblico
CertificadosOperadorVerificado lightP0AnualPúblico (estado) / detalle privado
Franjas/slotsSistemaLiveP0ContinuoAuth para reservar
ReseñasCocineroPublicadoP1Post-usoPúblico
PolíticasOperador + COMALPublicadoP0RaroPúblico
FAQCOMALPublicadoP1TrimestralPúblico
FacturasSistemaGeneradoP0Por pagoPrivado dueño

Matriz de permisos

MóduloCocinero VCocinero CCocinero ECocinero DOperador VOperador C/EOperador AprobarAdmin
Listado público
Ficha✓ propia
Reserva propia✓ cancel✓ soft✓ de su local✓ no-show
Check-in✓ propioforzar
Calendario ops
Precios ops
Ingresos✓ propios
Membresíacancel
Export datos✓ propioscuenta✓ local
Usuariosstaff localinvitar

Leyenda: V=Ver C=Crear E=Editar D=Eliminar

04 — Flujos de usuario · COMAL

Convenciones

  • TZ: Europe/Madrid
  • Slot: 1 hora; reserva mínima configurable (default 2 h)
  • Idempotencia: Idempotency-Key en pago y creación de reserva

F1 — Descubrimiento → Landing → Explorar

EntradaSEO, ads, link compartido, /
PasosVer hero → CTA Explorar → Listado con geo default ciudad
ResultadoUsuario en explorar (auth opcional para ver precios completos: decisión — precios visibles sin auth)
Analyticslanding_view, cta_explore_click

F2 — Registro / Login

Registro

  1. Email + contraseña (min 10 chars) o Google OAuth
  2. Nombre y teléfono
  3. Rol inicial: Cocinero (default) u Operador (ruta separada)
  4. Aceptación términos + privacidad
  5. Verificación email (magic link)
  6. Onboarding: ciudad, equipos frecuentes, aviso legal producción

Errores: email en uso, contraseña débil, OAuth cancelado
Recuperación: mensaje + link a login

Login

Email/password o Google · “Recordarme” · link olvidé contraseña

Recuperación contraseña

Email → link 30 min → nueva contraseña → sesión invalidada en otros dispositivos

Analytics: sign_up, login, password_reset_request


F3 — Explorar y filtrar

  1. Listado ordenado por distancia o relevancia
  2. Abrir filtros → aplicar chips equipo / precio / horario
  3. Vacío → empty state
  4. Tap en card → ficha

Estados: loading skeleton, error red, empty, resultados

Analytics: search_filter_apply, listing_impression, listing_click


F4 — Reserva end-to-end (crítico)

Ficha → Reservar → Fecha → Slots → Resumen → Pago → Confirmación
PasoUIReglas
FechaCalendario 14–60 días vistaNo pasado; lead time min 2 h
SlotsGrid horasSolo disponibles; selección contigua
ResumenCocina, estación, horas, €Desglose IVA, descuento membresía
PagoStripe Payment Element3DS si aplica
OKID reserva, ICS, QR previewEmail + push opcional

Decisiones en branch:

  • Slot se ocupa entre resumen y pago → error “ya no disponible” + reembolso si cargo
  • Pago falla → reintentar; no crear reserva
  • Usuario cierra → carrito no persistente (slots no hold largos); hold 10 min opcional v1.1

Analytics: booking_start, slot_select, checkout_start, payment_success|fail, booking_confirmed


F5 — Check-in

  1. Desde Mis reservas o tab Acceso
  2. Ventana: desde 15 min antes hasta fin de franja
  3. Muestra QR + PIN de 6 dígitos
  4. Operador escanea o introduce PIN en /ops/checkin
  5. Estado → “En curso”

Offline: PIN visible si reserva cacheada; validación operador puede ser manual
Error: fuera de ventana; reserva cancelada; PIN revocado


F6 — Cancelación

  1. Detalle reserva → Cancelar
  2. Mostrar política y importe reembolsable
  3. Confirmar
  4. Reembolso Stripe (parcial/total) async
  5. Slot liberado

Analytics: booking_cancel, refund_initiated


F7 — Membresía

Planes:

  • Sin plan: pay-as-you-go
  • Base (29€/mes): 10 % dto, soporte prioritario
  • Pro (59€/mes): 15 % dto, hold prioritario, 1 cancelación flexible/mes

Flujo: ver planes → Stripe Subscription → badge en UI


F8 — Operador: bloqueo y dashboard

  1. Login rol operador
  2. Dashboard: estaciones del día, llegadas, ocupación %
  3. Bloquear franja: motivo + rango
  4. Slots dejan de venderse

Estados de UI transversales

EstadoComportamiento
Empty listadoIlustración industrial + “Ampliar zona o quitar filtros”
LoadingSkeletons, no spinners de página completa en móvil
Error redBanner + Reintentar
ValidaciónInline bajo campo, aria-invalid
403“No tienes acceso” + volver
Sesión expiradaModal → re-login, preservar deep link
Sin resultadosEmpty específico
Pago parcialNo aplica (all-or-nothing)
DestructivoModal confirmación cancelar/borrar cuenta
UndoToast 5 s solo en favoritos (no en pagos)

Eventos analíticos (lista maestra)

Ver 12-analytics.md.

05 — Modelo de datos · COMAL

Diagrama ER simplificado

User 1──* Membership
User 1──* Booking
User *──* Kitchen (via KitchenStaff for operators)
Kitchen 1──* Station
Kitchen 1──* KitchenEquipment
Kitchen 1──* KitchenCertification
Station 1──* SlotLock / AvailabilityRule
Booking *──1 Station
Booking 1──1 Payment
Booking 1──0..1 CheckIn
Booking 1──0..1 Review
Booking 1──0..* BookingEvent (audit)

Entidades principales

User

CampoTipoNotas
iduuid PK
emailcitext unique
password_hashtext nullnull si solo OAuth
nametext
phonetext nullE.164
role_defaultenumcook, operator, admin
localetextes-ES
created_at / updated_attimestamptz
deleted_attimestamptz nullsoft delete

Kitchen

CampoTipoNotas
iduuid PK
slugtext unique
nametext
descriptiontext
address_line / city / postal / countrytext
lat / lngnumericíndice geo
timezonetextEurope/Madrid
base_price_centsintpor hora
min_hoursintdefault 2
cancellation_policyjsonb
statusenumdraft, published, suspended
owner_user_iduuid FK

Station

CampoTipo
iduuid
kitchen_iduuid FK
nametext
capacity_notestext
is_activebool

Equipment (catálogo) + KitchenEquipment (M2M)

code, label_es, icon_key

Certification

type, issuer, valid_until, document_url, verification_status

Booking

CampoTipoNotas
iduuid
public_codetextCOM-XXXX human
cook_user_iduuid
station_iduuid
starts_at / ends_attimestamptzexclusion constraint
statusenumpending_payment, confirmed, checked_in, completed, cancelled, no_show
price_breakdownjsonb
total_centsint
currencychar(3)EUR
hold_expires_attimestamptz null
cancelled_attimestamptz null

Constraint: EXCLUDE USING gist (station_id WITH =, tstzrange(starts_at, ends_at) WITH &&) WHERE (status IN ('confirmed','checked_in','completed','pending_payment'))

Payment

provider, provider_ref, amount_cents, status, raw_events jsonb

CheckIn

booking_id, method (qr|pin|manual), pin_hash, checked_in_at, checked_in_by

Membership

user_id, plan (base|pro), stripe_subscription_id, status, current_period_end

Review

booking_id unique, rating 1–5, body, published

Audit / BookingEvent

booking_id, actor_id, type, payload, created_at

Índices recomendados

  • bookings (cook_user_id, starts_at desc)
  • bookings gist exclusion (arriba)
  • kitchens (city), kitchens gist geo
  • kitchens (status) where published

Privacidad y retención

DatoClasificaciónRetención
PII usuarioPersonalHasta borrado + 30 días backup
PagosSensible financieroSegún obligación fiscal (ES ~5–6 años refs)
Logs accesoTécnico12 meses
Certificados docsPartnerMientras kitchen activa + 1 año

Cifrado: TLS en tránsito; campo phone opcional encrypted at rest; documentos en bucket privado firmado.

Multitenancy

  • Lógico por kitchen_id para operadores
  • Admin COMAL cross-tenant
  • No shared DB por tenant en v1 (single DB, RLS por rol)

Eventos de dominio

UserRegistered KitchenPublished BookingHoldCreated BookingConfirmed PaymentCaptured BookingCancelled CheckInCompleted ReviewSubmitted MembershipStarted

06 — Stack tecnológico · COMAL

Decisión de arquitectura

PWA monorepo full-stack orientada a velocidad de MVP y operaciones de reserva con integridad temporal.

CapaElecciónJustificación
FrontendNext.js 15 (App Router) + TypeScriptSSR landing SEO + app autenticada; PWA via serwist/next-pwa
UITailwind CSS v4 + tokens Paper exportadosParidad con design tokens
ComponentesRadix UI primitives + estilos propiosAccesibilidad de base
APItRPC o Route Handlers RESTtRPC si monorepo TS puro; REST si apps móviles después
AuthAuth.js (NextAuth v5)Email magic link + Google; roles en JWT/session
DBPostgreSQL (Neon)Exclusion constraints para slots; branching previews
ORMDrizzle ORMTipado, migraciones SQL claras
Cache / locksRedis (Upstash)Hold de slots, rate limit
PagosStripe Checkout/PaymentIntents + BillingPCI SAQ-A; suscripciones membresía
EmailResendTransaccional ES templates
SMS (opc.)TwilioRecordatorios check-in
MapsMapbox GLListado geo
StorageS3 compatible (R2/S3)Fotos y certificados firmados
HostingVercelEdge + serverless; ES region
ObservabilitySentry + Axiom/OpenTelemetryErrores y traces
AnalyticsPostHogProduct analytics + feature flags
CIGitHub Actionslint, typecheck, e2e Playwright

Por qué no X

AlternativaMotivo de descarte (v1)
React NativeCoste dual sin validar demanda
FirebaseMenos control de exclusion constraints de booking
Supabase Auth onlyViable; Auth.js + Neon da más control de modelo
MongoDBDebil para rangos temporales concurrentes

Integridad de reservas

  1. Hold en Redis 10 min (v1.1) o pending_payment con TTL
  2. EXCLUDE gist en Postgres al confirmar
  3. Webhook Stripe idempotente → confirmed
  4. Job de limpieza de pending expirados

Entornos

  • local · preview (Neon branch) · staging · production

Estimación de equipo mínimo implementación

2 fullstack, 1 designer part-time, 1 ops/product part-time — 10–14 semanas MVP ciudad piloto.

07-creative-direction.md

Abrir documento

07 — Dirección creativa · COMAL

Brief de diseño (Paper)

CampoValor
Mood candidatesindustrial · rusted · botanical · maritime · signage
Mood chosenindustrial (hormigón × naranja de seguridad)
Por qué no el primero instintoEl instinto “food” suele ir a cream + terracotta (cliché 2023–25). Industrial evoca cocina profesional real: señalética, extractores, turnos, no brunch lifestyle.
DirecciónClaridad de planta industrial con un momento de color naranja para acción; tipografía display editorial + UI técnica.

Paleta

RolHexReferencia de escena
Background#F4F2EFPolvo de hormigón / hueso
Surface#FFFFFFSuperficie de acero limpio
Ink#1A1A1ACaucho / tinta de rotulación
Ink muted#5C5955Acero oxidado suave
Ink subtle#8A8680Gris de tubería
Border#E0DCD6Junta de panel
Primary#E85D04Naranja de seguridad / baliza
Primary strong#C44D03Naranja quemado (pressed)
Primary soft#FFF0E6Halo de baliza
Secondary#5C6B5ASage de azulejo de cocina
Danger#B42318Señal de parada

Tipografía

UsoFamiliaPesos
Display / headlinesFraunces700
UI / bodyIBM Plex Sans400–600
Horas, códigos, PINIBM Plex Mono500–600

Escala

12 / 14 / 16 / 18 / 22 / 28 / 36 / 48 px
Line-height display ~1.15; body 1.5.

Principios visuales

  1. Un acento intenso (naranja) para CTAs y estados activos; el resto es neutro industrial.
  2. Asimetría controlada en marketing; alineación estricta en app y ops.
  3. Sin emojis; iconos SVG de trazo 2px.
  4. Precios y horas siempre legibles — nunca decoración sobre dato crítico.
  5. Fotos de cocina reales (placeholder oscuro en mockups) con badge VERIFICADA.

Logo wordmark

COMAL en Fraunces Bold + cuadrado naranja 1:1 a la izquierda (marca de “estación”).

Voz de marca (enlace a content guide)

Directa, profesional, sin jerga startup. Español de España claro.

08-design-system.md

Abrir documento

08 — Design system · COMAL

Tokens definidos en Paper como CSS variables. Fuente de verdad: archivo Paper + este documento.

Tokens de color

--color-background: #F4F2EF;
--color-surface: #FFFFFF;
--color-ink: #1A1A1A;
--color-ink-muted: #5C5955;
--color-ink-subtle: #8A8680;
--color-border: #E0DCD6;
--color-primary: #E85D04;
--color-primary-strong: #C44D03;
--color-primary-soft: #FFF0E6;
--color-secondary: #5C6B5A;
--color-secondary-soft: #E8EDE7;
--color-danger: #B42318;
--color-danger-soft: #FEE4E2;
--color-warning: #B54708;
--color-info: #175CD3;

Espaciado

4 · 8 · 12 · 16 · 20 · 24 · 32 · 40 · 48 · 64 px

Radios

4 (sm) · 8 (md) · 12 (lg) · 16 (xl) · 9999 (full)

Componentes

Button

VarianteUso
PrimaryCTA principal (bg primary, text white)
SecondaryAlternativa (surface + border)
GhostTexto ink, sin borde
DangerAcciones destructivas
Disabledopacity 0.45, no pointer

Altura táctil mínima: 44px. Padding horizontal 18–28px.

Input

  • Label 12–14px medium sobre campo
  • Campo: border border, radius md, padding 12–14
  • Focus: border primary 1.5–2px
  • Error: border danger + texto danger

Chip / Filter

  • Default: surface + border
  • Selected: ink bg + white text (listado) o primary-soft + primary border (estaciones)

Card cocina

  • Imagen 16:9 o altura fija ~120–140
  • Badge VERIFICADA / 24H
  • Título Fraunces 18
  • Meta 13 muted
  • Precio display alineado a la derecha

Slot hour

  • Disponible: surface + border
  • Selected: primary + white mono
  • Occupied: border fill + subtle text, no interactive

Bottom nav (móvil)

4 tabs: Explorar · Reservas · Acceso · Perfil
Active: primary stroke + label primary

Fondo ink; item activo #2A2A2A

Status badges

EstadoEstilo
En cursoprimary-soft / primary-strong
Confirmadasecondary-soft / secondary
Bloqueadaborder / muted
Errordanger-soft / danger

Empty / Error

Icono en frame 64–72, título Fraunces, body muted, CTA primary + secondary link

Breakpoints

640 · 768 · 1024 · 1280

Responsive rules

ViewportLayout explorar
<768Lista vertical + chips + bottom nav
≥1024Sidebar filtros + grid 3 cols + top nav

Librería en Paper

Implementada en artboards: botones, chips, cards, slots, badges, nav, sidebar, empty, error, check-in dark.

09-content-guide.md

Abrir documento

09 — Guía de contenido · COMAL

Voz y tono

AtributoNo
Clara“54€ por 3 horas, IVA incluido”“¡Tu cocina soñada te espera!”
Profesional“Reserva confirmada”“¡Boom, listo chef!”
Honesta“Sin reembolso con menos de 6 h”Omitir políticas en letra pequeña
Local ES“franja”, “cocina certificada”“slot”, “ghost kitchen” sin explicar

Principios UX writing

  1. Acción primero en botones: “Reservar franja”, no “Continuar”.
  2. Consecuencia visible en destructivos: “Cancelar reserva (reembolso 50%)”.
  3. Errores con salida: qué pasó + qué hacer + contacto.
  4. Números y horas en formato ES: 31 jul 2026 · 05:00–08:00 · 54,00 €.
  5. Zona horaria explícita en selección de franjas (Europe/Madrid).

Microcopy clave

ContextoCopy
CTA landingExplorar cocinas
CTA fichaReservar franja
CheckoutContinuar al pago
ÉxitoReserva confirmada
EmptySin cocinas con esos filtros
Pago failNo pudimos completar el pago
Check-inAcceso activo · ventana abierta
PINPIN de respaldo
Ops block+ Bloquear franja

Terminología

UsarEvitar
Cocina / estaciónKitchen unit (sin traducir)
FranjaSlot (en UI)
CocineroUsuario final genérico
OperadorHost / landlord
Verificada“Premium trust”
MembresíaSubscription (en UI)
  • Disclaimer en ficha: el operador declara la veracidad de certificados.
  • COMAL no otorga licencia sanitaria al cocinero.
  • Enlace a términos y privacidad en registro y pie.

10-accessibility.md

Abrir documento

10 — Accesibilidad · COMAL

Objetivo: WCAG 2.2 nivel AA en flujos críticos (explorar, reservar, pagar, check-in, ops dashboard).

Auditoría de diseño (checklist)

CriterioEstado diseñoNotas
Contraste texto ink sobre backgroundOK~15:1
Contraste texto white sobre primaryOKnaranja #E85D04 + white verificar ≥4.5 (ajustar a primary-strong en labels pequeños si hace falta)
Contraste muted 14px+Revisar en QAink-muted sobre surface
Target size ≥24px (2.2) / prefer 44px táctilOK en CTAs y nav
Focus visibleEspecificadoanillo 2px primary
Orden de foco lógicoEspecificado en handoff
Labels en inputs
Errores asociados al campoaria-describedby
No solo color en slotsleyenda + relleno
Texto en imágenesEvitadobadges como texto real
MotionReducir en prefers-reduced-motion
Idiomalang="es"
Skip linkDesktop app“Saltar al contenido”

Hallazgos y correcciones en esta entrega

  1. Primary sobre soft backgrounds — chips de equipo usan secondary-soft + secondary para no depender solo de naranja.
  2. Check-in dark mode — PIN en mono grande 36px; contraste white/ink OK.
  3. Estados ocupados — no solo gris: deshabilitados + leyenda.
  4. Pendiente QA real — axe-core + prueba teclado + VoiceOver en iOS Safari PWA.

Riesgos

  • Mapas: proporcionar lista equivalente.
  • QR: siempre PIN alternativo (cumplido en diseño).
  • PDF facturas: generar etiquetados en implementación.

No se declara cumplimiento legal definitivo — solo intención de diseño AA.

11-privacy-security.md

Abrir documento

11 — Privacidad y seguridad · COMAL

No constituye asesoramiento legal. Revisar con counsel antes de lanzamiento.

Datos personales tratados

DatoBase (hipótesis)Finalidad
Email, nombreContratoCuenta
TeléfonoContrato / interés legítimo recordatoriosCheck-in, soporte
Ubicación aproximadaConsentimientoDistancia a cocinas
PagosContratoStripe como encargado
Logs de accesoInterés legítimo seguridadFraude, incidentes
ReseñasContratoConfianza marketplace

Principios

  • Minimización: no pedir NIF en v1 salvo facturación empresa.
  • PSP: Stripe — no almacenar PAN.
  • Cifrado en tránsito TLS 1.2+.
  • Secretos en vault / env, no en repo.
  • RLS o checks de autorización por kitchen_id y user_id.
  • Soft delete + derecho de supresión (export + delete account).
  • Retención de facturas según obligación fiscal.

Amenazas y controles

AmenazaControl
Doble bookingExclusion constraint + locks
Enumeración de reservas ajenasAuthZ en API
Scraping de listadosRate limit
Fraude de pagoStripe Radar, 3DS
PIN filtradoPIN de un solo uso por reserva, hash at rest
Subida de malware en certificadosMIME allowlist, scan, bucket privado
XSSReact escape + CSP
CSRFSameSite + tokens en mutaciones cookie

Roles y acceso físico

COMAL no garantiza cerraduras smart en v1; el check-in puede ser validación humana. Documentar responsabilidad del operador.

Cookies

  • Esenciales sesión
  • Analytics (PostHog) con consentimiento si no estrictamente necesarias
  • Banner ES conforme ePrivacy (implementación)

Incidentes

Runbook: detectar → contener → notificar DPO/usuarios si alto riesgo (72h AEPD si aplica).

12 — Plan analítico · COMAL

Herramienta recomendada: PostHog (product) + Stripe (revenue) + Sentry (errors).

North Star

Horas de cocina confirmadas y completadas / semana

Funnel principal

landing_view → cta_explore_click → listing_view → listing_click
→ kitchen_view → booking_start → slot_select → checkout_start
→ payment_success → booking_confirmed → checkin_complete → review_submit

Eventos

EventoProps clave
landing_viewutm_*, city
sign_upmethod
loginmethod
search_filter_applyfilters[]
listing_impressionkitchen_id, position
kitchen_viewkitchen_id
booking_startkitchen_id, station_id
slot_selecthours, start
checkout_starttotal_cents
payment_success / payment_failreason
booking_confirmedbooking_id, hours
booking_cancelrefund_cents
checkin_completemethod
membership_startplan
ops_block_createdstation_id

KPIs semanales

  • Activation rate (1ª reserva ≤7d)
  • Checkout conversion
  • Completed kitchen-hours
  • No-show rate
  • Operator occupancy %
  • CSAT post-sesión

Privacidad analytics

IP truncada; no PII en props; opt-out en ajustes.

13 — Plan y casos de prueba · COMAL

Alcance MVP

Flujos: registro, explorar, reserva+pago, cancelación, check-in, ops bloqueo, membresía básica.

Tipos

TipoHerramienta
UnitVitest
Integration APIVitest + test DB Neon branch
E2EPlaywright
A11yaxe + manual teclado
PagoStripe test clocks
Cargak6 en hold/confirm (smoke)

Casos prioritarios

IDCasoEsperado
TC01Registro email válidoCuenta + mail verificación
TC02Filtro freidora sin resultadosEmpty state
TC03Selección 3h contiguasTotal 3×precio
TC04Slot se ocupa en checkoutError + no cargo / refund
TC05Pago 3DS OKbooking confirmed
TC06Pago failHold permanece, reintento
TC07Cancelación >24h100% refund
TC08Check-in fuera de ventanaBloqueado
TC09Check-in PIN correctochecked_in
TC10Ops bloquea franjaNo vendible
TC11Usuario A no ve reserva B403
TC12WCAG teclado reservaCompletable sin ratón

Criterios de salida a staging

  • 0 P0 abiertos
  • Pago y booking race cubiertos
  • Lighthouse a11y ≥ 90 en ficha y checkout

14 — Handoff de diseño (UX/UI) · COMAL

Alcance actual: entrega de producto, UX y UI de alta fidelidad.
Fuera de alcance ahora: implementación de código, repos de app o pipelines.

Referencias

RecursoUbicación
Paper hi-fihttps://app.paper.design/file/01KYX2GFM9EGHF4EG0AQZJPZ5G
File ID01KYX2GFM9EGHF4EG0AQZJPZ5G
Inventario artboards00-paper-reference.md (35 pantallas)
Definición producto01-project-definition.md
Flujos04-user-flows.md
Interacciones16-interaction-specs.md
Datos (orientativo)05-data-model.md
Stack recomendado (futuro)06-tech-stack.md
TokensPaper + 08-design-system.md
Contenido09-content-guide.md
Accesibilidad10-accessibility.md

Artboards entregados (35 — completos en Paper)

Marketing: Landing cocineros · Landing operadores

Auth: Login · Registro · Recuperar contraseña · Email enviado · Validación error · Sesión expirada

Cocinero: Onboarding · Explorar m/d · Ficha · Reserva · Sin huecos · Checkout · Confirmación · Mis reservas · Empty reservas · Detalle · Cancelar · Check-in · Perfil · Planes · Notificaciones · Facturas

Estados: Empty filtros · Loading · Error pago · Error red

Operador: Dashboard · Calendario · Bloquear franja · Precios/estaciones · Check-in recepción (tablet)

Sistema: Design System

Especificaciones de interacción (resumen)

ElementoComportamiento
Slot selectContiguo; mínimo 2 h
Hold pagoCountdown en pantalla error
Sticky CTA fichafixed bottom + safe-area
Bottom navExplorar · Reservas · Acceso · Perfil
Filtros mobilebottom sheet
Opsfilas ≥48px; badges de estado

Detalle completo: 16-interaction-specs.md.

Cuando se implemente (futuro)

  1. Exportar desde Paper (get_jsx / computed styles), no desde capturas.
  2. Orden sugerido: Auth → Catálogo → Booking → Check-in → Ops → Membresía.
  3. DoD por pantalla: tokens, empty/loading/error, a11y, analytics, e2e.

Definition of Done — entrega UX/UI (esta fase)

  • Flujo cocinero end-to-end en hi-fi
  • Flujo operador principal en hi-fi
  • Auth + recuperación + onboarding
  • Cancelación, membresía, facturas, notificaciones
  • Estados empty, loading, error, red, sesión, sin huecos
  • Responsive mobile + desktop + tablet ops
  • Design system en Paper
  • 35 artboards con contenido en Paper
  • Documentación de producto y UX
  • Spec de interacciones + mapa de prototipo
  • Auditoría de completitud

15 — Roadmap · COMAL

Fase 0 — Foundation (2–3 sem)

  • Design system en código
  • Auth, layout PWA shell
  • CI, entornos Neon

Fase 1 — MVP ciudad piloto (8–10 sem)

  • Listado + ficha + reserva + pago
  • Check-in PIN
  • Ops: calendario día, bloqueos, listado reservas
  • Emails transaccionales
  • 10–20 cocinas onboarded concierge

Fase 2 — Retención (4–6 sem)

  • Membresías Stripe Billing
  • Reseñas
  • Reservas recurrentes
  • Hold de slots + mejor race handling
  • CSAT in-app

Fase 3 — Escala (6–8 sem)

  • Multi-ciudad
  • Cerraduras smart (partner)
  • App nativa si métricas PWA lo justifican
  • Facturación avanzada operadores
  • Programa referidos

Métricas de go/no-go entre fases

De → ACondición
1 → 2≥ 200 completed kitchen-hours / mes; no-show < 12%
2 → 3Retención D30 cocineros ≥ 40%; ≥ 2 ciudades con waitlist operadores

16-interaction-specs.md

Abrir documento

16 — Especificación de interacciones · COMAL

Documento de prototipo / comportamiento UI. Sin implementación de código en esta entrega: sirve como especificación para diseño y futuro desarrollo.

Mapa de pantallas y navegación

Landing ──► Explorar ──► Ficha ──► Reserva (slots) ──► Checkout ──► Confirmación ──► Check-in
   │            │          │
   │            │          └── (auth gate si no sesión) → Login / Registro → Onboarding → vuelve
   │            └── Empty | Loading
   └── Login / Registro

Bottom nav (auth): Explorar | Reservas | Acceso | Perfil
Ops sidebar: Dashboard | Calendario | Reservas | Estaciones | Ingresos | Config

Transiciones y microinteracciones

ElementoInteracciónDetalle
CTA primaryPressFondo → primary-strong; scale 0.98 opcional 100ms
Chip filtroToggleActive: ink bg + white; multi-select equipos
Slot horaSelectSolo contiguos; al romper contigüidad se reinicia o se extiende el rango
Sticky CTA fichaFixedSafe-area bottom; no tapa contenido (padding-bottom lista)
Bottom sheet filtros (móvil)DragBackdrop 40% ink; dismiss swipe down
Modal cancelaciónConfirm2 botones: Cancelar reserva (danger) / Volver
Hold pagoCountdownVisible en error pago; al 00:00 liberar slot y mensaje
Check-in QRFullscreen darkBrightness note en copy; PIN siempre visible
Skeleton loadingPulseOpacity 0.6↔1, 1.2s, prefers-reduced-motion = static
Toast éxito4sBottom, no bloquea nav
Ops bloqueoClick franjaSide panel o modal: motivo + rango + guardar

Gestos móviles

  • Pull-to-refresh en Explorar y Mis reservas
  • Swipe back en iOS/Android nativo web (browser)
  • No swipe-to-delete en reservas (evitar accidente); cancelar solo en detalle

Validaciones en UI

CampoRegla visual
EmailFormato; error inline rojo
ContraseñaMin 10; meter strength opcional v1.1
TeléfonoMáscara ES +34
SlotsMin 2 h (mensaje si 1 sola hora)
TérminosCheckbox required; CTA disabled hasta check

Estados por pantalla (matriz)

PantallaDefaultLoadingEmptyErrorSuccess
ExplorarListaSkeleton 15Empty filtrosBanner reintentar
FichaContenidoSkeleton heroNo disponible
ReservaSlotsPulse slotsSin huecos díaRed
CheckoutFormButton spinnerPago fallido → 14→ Confirmación
ReservasCardsSkeleton cardsSin próximas
Check-inQR+PINFuera de ventanaPIN inválido opsChecked-in
Ops dashTablaSkeleton rowsDía vacío

Flujo de prototipo recomendado (demo stakeholder)

  1. Landing → Explorar
  2. Abrir Kitchen Hub Vallecas
  3. Reservar 05–08
  4. Checkout → (simular éxito) Confirmación
  5. Mis reservas → Check-in
  6. Ops Dashboard + Calendario

En Paper: artboards enlazables manualmente o presentación en orden de capa.

Criterios de aceptación UX (no código)

  • Usuario entiende precio total antes de pagar
  • Política de cancelación legible en ficha y checkout
  • Check-in usable con una mano en exterior
  • Operador ve ocupación del día en < 5 s de mirada
  • Empty y error tienen siguiente acción clara

17-prototype-map.md

Abrir documento

17 — Mapa de prototipo y navegación · COMAL

Especificación de prototipo clicable de extremo a extremo.
En Paper: artboards hi-fi. Donde el MCP de Paper esté limitado, los mockups complementarios están en ui-mockups/.

Flujo maestro (cocinero)

[01 Landing]
    ├─ CTA Explorar ──────────────────────────────► [05 Explorar]
    ├─ CTA Soy operador ──────────────────────────► [01b Landing operadores]
    ├─ Entrar ────────────────────────────────────► [02 Login]
    └─ Crear cuenta ──────────────────────────────► [03 Registro]

[02 Login]
    ├─ Entrar OK ─────────────────────────────────► [05 Explorar] | deep link
    ├─ ¿Olvidaste? ───────────────────────────────► [02b Recuperar]
    ├─ Google OK ─────────────────────────────────► [05] o [04 Onboarding] si nuevo
    ├─ Crear cuenta ──────────────────────────────► [03 Registro]
    └─ Error validación ──────────────────────────► [18 Error validación]

[02b Recuperar] ── Enviar ──► [02c Email enviado] ── Volver ──► [02 Login]

[03 Registro]
    ├─ Cocinero + OK ─────────────────────────────► [04 Onboarding]
    └─ Operador ──────────────────────────────────► onboarding ops (concierge / 01b)

[04 Onboarding] ── Continuar / Saltar ────────────► [05 Explorar]

[05 Explorar]
    ├─ Card cocina ───────────────────────────────► [06 Detalle]
    ├─ Filtros sin resultados ────────────────────► [13 Empty]
    ├─ Carga ─────────────────────────────────────► [15 Loading]
    ├─ Error red ─────────────────────────────────► [20 Error red]
    └─ Bottom: Reservas|Acceso|Perfil ────────────► [09]|[10]|[11]

[06 Detalle] ── Reservar ──► [07 Reserva] (auth gate → 02 si hace falta)

[07 Reserva]
    ├─ Continuar al pago ─────────────────────────► [08b Checkout]
    └─ Sin huecos día ────────────────────────────► [19 Sin huecos]

[08b Checkout]
    ├─ Pagar OK ──────────────────────────────────► [08 Confirmación]
    └─ Pago fail ─────────────────────────────────► [14 Error pago] ⇄ reintentar

[08 Confirmación]
    ├─ Ver acceso ────────────────────────────────► [10 Check-in]
    └─ Mis reservas (implícito) ──────────────────► [09]

[09 Mis reservas]
    ├─ Empty ─────────────────────────────────────► [16 Empty reservas]
    ├─ Detalle ───────────────────────────────────► [09b Detalle reserva]
    └─ Check-in ──────────────────────────────────► [10]

[09b Detalle]
    ├─ Check-in ──────────────────────────────────► [10]
    └─ Cancelar ──────────────────────────────────► [09c Cancelar] ── confirmar ──► [09]

[10 Check-in] ── Reportar problema ───────────────► soporte (mailto / form futuro)

[11 Perfil]
    ├─ Ver planes ────────────────────────────────► [11b Planes]
    ├─ Notificaciones ────────────────────────────► [11c]
    ├─ Facturas / pagos ──────────────────────────► [11d]
    ├─ Privacidad ────────────────────────────────► copy + export/delete (doc)
    └─ Cerrar sesión ─────────────────────────────► [02]

[17 Sesión expirada] ── Entrar ───────────────────► [02] + restore deep link

Flujo operador

[01b Landing operadores]
    ├─ Publicar / Solicitar ──────────────────────► lead form (copy en landing)
    └─ Entrar ────────────────────────────────────► [02] rol operador

[Op-01 Dashboard]
    ├─ Bloquear ──────────────────────────────────► [Op-03 Bloquear]
    └─ Nav ───────────────────────────────────────► Op-02 | Op-04 | Op-05

[Op-02 Calendario] ── + Bloquear ─────────────────► [Op-03]
[Op-04 Precios y estaciones]
[Op-05 Check-in recepción] (tablet)

Orden de demo stakeholder (15 min)

  1. 01 Landing → 05 Explorar → 06 Ficha → 07 Reserva → 08b Checkout → 08 Confirmación → 10 Check-in
  2. 09 Mis reservas → 09b → 09c (cancelación)
  3. 11 → 11b Planes
  4. 01b Operadores → Op-01 → Op-02 → Op-03 → Op-04 → Op-05
  5. Estados: 13, 14, 15, 16, 17, 18, 19, 20

Hotspots mínimos por artboard

DesdeHotspotHacia
Landing CTAExplorar cocinas05
Explorar cardKitchen Hub06
Ficha stickyReservar franja07
Reserva CTAContinuar al pago08b
CheckoutPagar08
ConfirmaciónVer acceso10
Reservas cardDetalle09b
DetalleCancelar09c
PerfilVer planes11b
Login¿Olvidaste?02b
Ops dash+ BloquearOp-03

Criterio de “prototipo completo”

  • Camino feliz cocinero documentado y diseñado
  • Auth + recuperación
  • Cancelación con confirmación
  • Membresía
  • Estados empty / loading / error / sesión / validación / red / sin huecos
  • Ops: dash, calendario, bloqueo, precios, check-in recepción
  • Landing operadores
  • Enlaces hotspots nativos en Paper (cuando la herramienta lo permita; mapa aquí es fuente de verdad)

18-completeness-audit.md

Abrir documento

18 — Auditoría de completitud UX/UI · COMAL

Cierre: 2026-08-01
Alcance: producto + UX + UI hi-fi. Excluido: implementación de código de producto.

Matriz de entregables del brief diario

#EntregableEstadoEvidencia
1Identidad y definición01-project-definition.md
2Problema / supuestos01
3Objetivos y métricas01
4Stakeholders02
5Personas02 (4 perfiles)
6JTBD02
7Historias + MoSCoW + AC02 + 19-backlog-completo.md
8Journey map02
9Service blueprint02
10Arquitectura de información03
11Matriz de permisos03
12Flujos prioritarios04 + 17
13Modelo de datos05
14Stack recomendado06 (recomendación, no código)
15Dirección creativa07
16TokensPaper + 08
17Design system / componentesPaper 00 + 08
18Pantallas hi-fi35 artboards en Paper
19Estados y edge casesEmpty, loading, error pago/red, validación, sesión, sin huecos, cancel
20ResponsiveMobile 390 + Desktop 1440 + tablet 768
21Spec interacciones / prototipo16 + 17
22Guía de contenido09
23Accesibilidad WCAG 2.2 AA (diseño)10
24Privacidad y seguridad11
25Plan analítico12
26Plan de pruebas13
27Handoff diseño14
28Roadmap producto15
29Presentación ejecutivapresentation/
30Registry + memoryactualizados
31Código de productoExcluido a propósito

Inventario Paper (35/35 con contenido)

Todos los artboards listados en 00-paper-reference.md tienen contenido hi-fi en el archivo Paper (incluyendo los rellenados tras Paper Pro: landing operadores, bloqueo, precios, estados 16–20, facturas, check-in recepción).

Autoverificación §29

PreguntaResultado
Concepto distinto y problema concreto
Flujos principales completos
Empty / load / error / recovery
Auth + cancelación + membresía + ops
Responsive
Design system
Docs de producto y handoff
Paper hi-fi completo
Código de producto⛔ no aplica

Deuda residual (no bloqueante)

  1. Hotspots nativos clicables en Paper (mapa en 17 es la fuente de verdad).
  2. Investigación de campo real.
  3. Fotografía real de cocinas (placeholders controlados).
  4. Certificación legal WCAG / RGPD (orientación de diseño solo).

Declaración de cierre

COMAL se declara completo en alcance UX/UI de principio a fin para el cron diario, sin implementación de código.

19-backlog-completo.md

Abrir documento

19 — Backlog completo (historias + AC) · COMAL

Todas las historias con MoSCoW. Las Must tienen criterios de aceptación.

Épica A — Descubrimiento

IDHistoriaMoSCoWAC resumidos
A1Filtrar por ciudad, €/h, equipoMustchips multi; contador; empty 13
A2Ver certificaciones y fotosMustbadge VERIFICADA; galería
A3Política cancelación en fichaMustbloque legible antes de CTA
A4Ordenar por distanciaShoulddefault distancia si geo
A5Mapa de cocinasCouldlista siempre primaria
A6FavoritosCould
A7Comparar 2 cocinasWon’t

Épica B — Reserva y pago

IDHistoriaMoSCoWAC
B1Elegir fecha y franjas 1 hMustcontiguas; min 2 h; TZ Madrid
B2Desglose precioMustbase, dto, IVA, total
B3Pagar tarjetaMust3DS; success→08; fail→14
B4Cancelar según políticaMust09c; reembolso mostrado
B5Hold 10 minShouldvisible en 14
B6ICS calendarioShouldCTA confirmación y detalle
B7Reservas recurrentesWon’t v1

Épica C — Check-in

IDHistoriaMoSCoWAC
C1QR + PIN en ventanaMust15 min antes → fin; fuera→mensaje
C2Checklist salidaShouldpost check-out
C3Ops validar PINMustOp-05

Épica D — Operador

IDHistoriaMoSCoWAC
D1Dashboard díaMustocupación, lista, CTAs
D2Bloquear franjasMustOp-03; deja de vender
D3Editar precios/estacionesMustOp-04
D4Calendario semanalMustOp-02
D5Export ingresosShouldCSV
D6Multi-localCould

Épica E — Cuenta

IDHistoriaMoSCoWAC
E1Registro emailMustrol, términos
E2Login + GoogleMust
E3Recuperar contraseñaMust02b→02c
E4Onboarding equipos/ciudadShouldskippable
E5Membresía Base/ProShould11b
E6NotificacionesShould11c toggles
E7FacturasShould11d
E8Export/borrar datosMustprivacidad
E9Sesión expiradaMust17 + deep link

Épica F — Confianza y soporte

IDHistoriaMoSCoWAC
F1Reseñas post-usoShould
F2Reportar accesoMustCTA check-in
F3Error red recoverableMust20

No objetivos (Won’t)

IA menús · chat in-app · app nativa v1 · marketplace de personal · reservas de comensales.

20-implementation.md

Abrir documento

20 — Implementación · COMAL

Repositorio

CampoValor
GitHubhttps://github.com/Criscode2022/comal-app
Local/Users/cristian/orca/comal-app
StackAngular 19 + NestJS 11 + Prisma 6 + Neon + Tailwind CSS

Neon

CampoValor
Projectcomal-app
Project IDsuper-cell-05525663
Branchmain (br-holy-night-a65dwu42)
Databaseneondb
Regiónus-west-2

Connection string en apps/api/.env (local, no commiteado). Plantilla: .env.example.

Arranque

cd /Users/cristian/orca/comal-app

# API (puerto 3000)
cd apps/api && npm install && npx prisma generate && npm run start:dev

# Web (puerto 4200)
cd apps/web && npm install && npm start

Cuentas seed

RolEmailPassword
Cocinerolucia@tacosmovil.espassword123
Operadorelena@kitchenhub.espassword123

API (prefijo /api)

MétodoRutaAuth
POST/auth/registerNo
POST/auth/loginNo
GET/auth/meJWT
GET/kitchensNo
GET/kitchens/:slugNo
GET/bookings/availabilityNo
GET/POST/bookingsJWT
POST/bookings/:id/cancelJWT
POST/bookings/:id/check-inJWT
GET/ops/dashboardJWT operador
POST/ops/check-inJWT operador
POST/ops/blocksJWT operador

UI Angular (rutas)

RutaPantalla
/Landing
/entrarLogin
/registroRegistro
/explorarListado cocinas
/cocinas/:slugFicha
/reservar/:slugReserva franjas
/reservasMis reservas
/reservas/:idDetalle + PIN + cancelar
/perfilCuenta
/opsDashboard operador + PIN recepción

Alcance implementado vs Paper

Must del vertical slice: explorar, ficha, reserva, auth, listado/detalle reserva, cancelar, check-in, ops dashboard + validar PIN.

No en v1 de código (sí en diseño Paper): Stripe real, membresía de pago, PWA offline, multi-ciudad, tablets dedicadas, OAuth Google.

Verificación

  • Neon proyecto + migrate + seed
  • API Nest arranca y responde
  • Angular build OK
  • Repo GitHub pusheado