Investigación y documentación

Documentación · ATRIO

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

En esta página Referencia Paper — ATRIO 0%

00-paper-reference.md

Abrir documento

Referencia Paper — ATRIO

CampoValor
File ID01KYY20FFWZAN9PPH1RFEGJFVB
URLhttps://app.paper.design/file/01KYY20FFWZAN9PPH1RFEGJFVB
NombreATRIO — Daily UX 2026-08-01
Fecha2026-08-01
Estado UINivel 335 artboards UI/UX + 5 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 + DESKTOP PUBLIC00 DS · Home · Expo · Detalle · Plan · Entradas · Confirmación · Visita
3MOBILE PUBLICHome · Expo · Detalle · Visita · Entradas
4STAFF / ADMIN L3Login · Dashboard · Solicitudes · CMS list · CMS edit
5SYSTEM STATESEmpty · Loading · Error red · 404 · Validación · Forbidden

A. UI de producto (24)

#ArtboardDispositivo
00Design SystemDesktop
01–02HomeDesktop + Mobile
03–04Exposiciones / DetalleDesktop
05–07Visita / Entradas / ConfirmaciónDesktop
08–10Empty / Loading / ErrorDesktop
11–14Exposiciones / Detalle / Visita / EntradasMobile
15–18Staff / 404 / Validación / VisitaDesktop
19–23Login / Staff L3 / CMS list / CMS edit / 403Mixed

B. Proceso UX (11) — alineado a markdown del case

ArtboardContenidoDoc fuente
UX-00 Research coverPortada proceso UX
UX-01 StakeholdersMapa influencia × interés02
UX-02 PersonasMarta, Luis, Noa, Clara02
UX-03 JTBD3 jobs + barreras02
UX-04 User storiesÉpicas E1–E4 MoSCoW + AC02 / 19
UX-05 Journey mapsLuis + Marta/Clara02
UX-06 Service blueprintCapas + fallos02
UX-07 Site map + IAPúblico + JWT + CMS L303
UX-08 Flujos de usuarioF1–F5 diagramas04
UX-09 Modelo datos + permisosER + matriz L305 / 03
UX-10 Definición + métricasProblema, valor, north star01

Total: 35 artboards hi-fi en Paper.

Media real

assets/exhibitions/*.jpg vía paper-asset:// en UI de producto.

01-project-definition.md

Abrir documento

01 — Definición del proyecto: ATRIO

5.1 Identidad

CampoValor
NombreATRIO
SignificadoDel atrio del museo: umbral entre la calle y las salas de exposición
EsloganEl umbral entre la ciudad y la obra
Una fraseWeb pública del museo municipal para descubrir exposiciones, planificar la visita y solicitar entradas o grupos
Descripción ejecutivaATRIO es el canal digital del Museo Municipal de Rivera: catálogo editorial de exposiciones con ficha, información práctica de visita (horarios, tarifas, acceso, accesibilidad) y captura de demanda de entradas/grupos/escolares sin checkout online en v1. Reduce fricción frente a redes dispersas y llamadas a taquilla.
SectorCultura / Museos / Administración local
TipoWeb pública institucional + panel staff ligero de leads
Plataforma principalWeb responsive (desktop-first editorial, mobile usable)
SecundariasEmail de confirmación (stub v1); kiosco / ticketing online (roadmap)
MercadoEspaña/Latam — museo municipal de ciudad mediana (constructo; Rivera como sede ficticia de trabajo)
Idioma UIEspañol
Otros idiomasCatalán / inglés (roadmap)

5.2 Problema

TipoContenido
PrincipalVisitantes y docentes no encuentran en un solo sitio qué se expone, cuándo y cómo reservar o comprar entrada
SecundariosContenido en PDF/Instagram/carteles; colas de info en taquilla; grupos escolares sin canal claro; comunicación sin rastro de demanda
QuiénCiudadanos, turistas de paso, docentes, familias, staff de comunicación
HoyLlamadas, email genérico, redes, cartel en fachada
DeficienciasInfo desactualizada; sin ficha de exposición; sin registro de solicitudes
CosteVisitas perdidas, personal de taquilla saturado, baja ocupación en franjas tranquilas, mala experiencia turística
OportunidadWeb ligera con catálogo vivo + captura de demanda

Clasificación de conocimiento

ClaseEjemplos
Supuestos de diseñoEl museo no tiene e-commerce de tickets; un lead es suficiente en v1; público con alfabetización digital media-alta
HipótesisUn formulario de 5 campos reduce llamadas de grupos ≥30 %
DecisionesSin pago online v1; staff con STAFF_KEY no OAuth; stack Angular/Nest/Neon

5.3 Objetivos

TipoObjetivos
NegocioAumentar visitas planificadas; reducir consultas repetitivas; visibilidad de temporal
UsuarioSaber qué ver, cuándo ir, cómo llegar, cómo pedir entrada/grupo
ProductoCatálogo + plan de visita + formulario + bandeja staff de solicitudes
ExperienciaClaridad editorial, confianza institucional, lectura cómoda (WCAG AA)
TécnicosAPI de contenido; seed realista; CORS; sin secretos en git
No objetivosPago online, membresía, app nativa, multi-museo SaaS, i18n completo
RestriccionesStack fijo cron; calidad portfolio aunque Nivel 1 de alcance
RiesgosContenido desactualizado; expectativa “comprar ya”; clave staff débil en prod

5.4 Métricas

MétricaDefinición
North StarSolicitudes de visita/entrada completadas / semana
Activación% visitas que abren ≥1 ficha de exposición
Conversión% que envían formulario de entradas
RetenciónVisitas recurrentes al catálogo (30 d)
TareaTiempo a info de visita útil < 60 s
AbandonoFormulario iniciado sin envío
ErrorTasa de fallos POST visit-requests
StaffTiempo medio NEW → CONTACTED
A11y0 issues críticos automatizados en journey principal
LCPHome < 2,5 s en 4G medio

Complejidad y calidad

  • Alcance: Nivel 1 (web pública + leads + staff ligero).
  • Calidad: barra completa del cron §6.1 (paridad documental y de estados con proyectos de mayor nivel).

02-ux-research-strategy.md

Abrir documento

02 — Investigación UX y estrategia · ATRIO

Nota metodológica: No hay investigación primaria. Perfiles, JTBD y journeys son constructos de diseño. Validar con observación en taquilla y entrevistas a docentes antes de producción.


6.1 Stakeholders

StakeholderInfluenciaInterésNecesidadesRiesgosRelación
Dirección museoAltaAltaVisitas, reputación, servicio públicoScope políticoPropietario
Comunicación / webMediaAltaContenido actualizable, SEOBurnout editorialEditor
Taquilla / atenciónMediaAltaMenos llamadas repetidasResistencia al cambioOperador
DocentesBajaAltaGrupos, confirmaciónAbandono si no respondenUsuario clave
Visitante ciudadanoBajaMediaClaridad, horarios, a11yNo vuelveUsuario principal
Turista de pasoBajaMediaMóvil, 1 expo “imperdible”BounceUsuario secundario
AyuntamientoAltaMediaTransparencia, accesibilidadPlazos y pliegosPatrocinador
ConservaciónMediaMediaCorrecta presentación de obraConflictos de copyContribuidor
Legal / privacidadAltaMediaRGPD en formulariosMultasGatekeeper
Soporte técnico municipalMediaBajaHosting estableDowntimeDependencia

6.2 Perfiles de usuario

Perfil 1 — Marta “Docente” (primaria)

CampoDetalle
RolProfesora de secundaria, organiza salidas culturales
Edad38
Contexto1–2 visitas al museo al año con 20–28 alumnos
Experiencia digitalMedia-alta (email del centro, Classroom)
MotivacionesCumplir programación; logística simple y confirmable
NecesidadesFormulario de grupo, fechas, respuesta en 48 h
ObjetivosReservar visita escolar a “Luz de sala” en abril
Frustraciones“No sé si hay cupo ni a quién escribir”
LimitacionesSolo puede gestionar en recreos; móvil a veces
DispositivosAndroid + portátil del centro
EntornoSala de profesores; wifi irregular
AccesibilidadPrefiere formularios cortos, labels claros
Cita«Si puedo pedir grupo en cinco minutos, lo hago.»
EscenarioMartes 11:20: rellena formulario escolar para 24 personas el 18/04

Perfil 2 — Luis “Visitante local”

CampoDetalle
RolJubilado reciente, visita culturales de mañana
Edad62
ContextoVive en la ciudad; busca temporales nuevas
Experiencia digitalMedia; prefiere web clara
MotivacionesVer algo nuevo sin colas ni sorpresas de horario
NecesidadesLetra legible, horarios, tarifas, acceso
ObjetivosConfirmar si la temporal está abierta el domingo
FrustracionesHorarios confusos en redes; PDFs
DispositivosiPad + portátil en casa
EntornoCasa, luz diurna
AccesibilidadTexto ≥16px; contraste alto; sin jerga
Cita«Solo quiero saber si está abierta la temporal.»
EscenarioSábado noche: mira home y ficha, planifica domingo 11:00

Perfil 3 — Noa “Turista 48 h”

CampoDetalle
RolVisitante de fin de semana
Edad27
Contexto48 h en la ciudad; 1 actividad cultural
Experiencia digitalAlta
MotivacionesUna exposición “imperdible” bien fotografiada
NecesidadesMobile-first, hero claro, CTA entradas
ObjetivosDecidir en 2 minutos si va al museo o a otro plan
FrustracionesWebs municipales anticuadas
DispositivosiPhone
Entorno4G en la calle
AccesibilidadTouch targets grandes
Cita«Si se ve bien en el móvil, compro o voy.»
EscenarioViernes 18:00: abre home en el tren, guarda “Planificar visita”

Perfil 4 — Clara “Comunicación museo” (staff)

CampoDetalle
RolTécnica de comunicación y públicos
Edad34
ContextoGestiona web, redes y bandeja de visitas de grupo
Experiencia digitalAlta
MotivacionesResponder leads a tiempo; medir demanda
NecesidadesListado de solicitudes NEW/CONTACTED/CLOSED
ObjetivosBajar tiempo de primera respuesta a < 1 día laborable
FrustracionesEmails perdidos en bandeja compartida
DispositivosMacBook en oficina
Cita«Necesito ver quién escribió ayer y marcarlo contactado.»
EscenarioLunes 09:00: abre /staff, filtra NEW, llama a Marta

6.3 Jobs To Be Done

JTBD 1 — Visitante, decidir visita

Cuando tengo un hueco cultural, quiero ver qué hay abierto y la ficha de la exposición, para decidir si merezco el desplazamiento.

JTBD 2 — Docente, grupo escolar

Cuando organizo una salida, quiero solicitar plaza de grupo y dejar mis datos, para recibir confirmación sin depender del email genérico.

JTBD 3 — Staff, gestionar demanda

Cuando llegan peticiones, quiero verlas ordenadas y cambiar su estado, para no perder leads y medir carga de trabajo.

JTBDBarrerasAlternativas actuales
1Web rota, sin fotosInstagram, boca a boca
2Sin formularioTeléfono taquilla
3Email caóticoExcel manual

6.4 Historias de usuario (épicas)

Épica E1 — Descubrir exposiciones

IDHistoriaPrioridadAC (resumen)Métrica
E1-1Como visitante, quiero ver exposiciones publicadas en home y listado, para elegir qué visitarMustSolo published; cards con foto, título, fechas, estadoexhibition_list_view
E1-2Como visitante, quiero filtrar por Actual/Próxima/Pasada, para acotarShouldQuery status; empty si 0filter_apply
E1-3Como visitante, quiero abrir ficha por slug, para leer cuerpo y comisariadoMust404 si no existe; CTA entradas/visitaexhibition_view
E1-4Como sistema, quiero seed de 3 exposiciones realistas, para demoMustSeed idempotente o documentado

Épica E2 — Planificar visita

IDHistoriaPrioridadACMétrica
E2-1Como visitante, quiero horarios, tarifas, dirección y a11y, para planificar el díaMustDatos de /visit-info; error reintentablevisit_plan_view
E2-2Como visitante, quiero CTA a solicitar entradas desde visita y detalleMustLinks a /entradas con exhibitionId opcionalcta_click

Épica E3 — Solicitar entradas / grupo

IDHistoriaPrioridadACMétrica
E3-1Como visitante/docente, quiero enviar solicitud con nombre, email, personas y tipoMustValidación; 201; status NEWvisit_request_submit
E3-2Como visitante, quiero ver confirmación clara tras envíoMustPantalla success con email
E3-3Como visitante, quiero mensajes de error de validación y de redMustCampos + bannervisit_request_error

Épica E4 — Staff solicitudes

IDHistoriaPrioridadACMétrica
E4-1Como staff, quiero listar solicitudes con clave, para gestionar demandaShould→Must v1.1Header x-staff-key; 401 si nostaff_list
E4-2Como staff, quiero marcar CONTACTED/CLOSEDMust staffPATCH statusstaff_status_change

MoSCoW

MustShouldCouldWon’t ahora
Catálogo, ficha, visita, form, estados, seed, staff básicoEmail real, CMS exposicionesColección, agenda educativa, i18nPago online, app nativa, multi-museo

Casos de error / alternativos (E3)

  • Email inválido → no envía, mensaje bajo campo
  • API caída → banner + teléfono de recepción
  • exhibitionId inválido → 400
  • Doble submit → botón disabled en sending

6.5 Journey maps

Journey A — “Sábado de exposición” (Luis)

FaseAcciónPensamientoEmociónTouchpointProblemaOportunidadMétrica
DescubrirAbre home“¿Qué hay?”CuriosidadHome heroHero genéricoFoto real + temporalpage_view
ExplorarScroll / listado“¿Me interesa?”InterésCardsSin fotoMedia reallist_view
EvaluarFicha“¿Cuándo?”ConfianzaDetalleTexto densoTipografía displayexhibition_view
Planificar/visita“¿Abre domingo?”AlivioPlan visitaInfo incompletaBloques clarosvisit_plan_view
DecidirVa en personaSatisfacciónOffline

Journey B — “Salida escolar” (Marta)

FaseAcciónEmociónTouchpointOportunidad
NecesidadPrograma trimestreEstrés
DescubrirFicha temporalEsperanzaDetalleCTA grupo
SolicitarForm escolar 24 paxAnsiedad/entradasTipos SCHOOL
EsperarEmail (futuro)ImpacienciaSLA 2 días
StaffClara marca CONTACTED/staffEstado visible

Journey C — “Lunes de bandeja” (Clara)

FaseAcciónTouchpoint
Entrar/staff + claveStaff
FiltrarNEWStaff filters
Contactarmailto / teléfonoLista
CerrarCONTACTED → CLOSEDPATCH

6.6 Service blueprint (resumen)

CapaElementos
UsuarioNavega, lee, envía form
FrontstageWeb ATRIO, confirmación UI, (futuro) email, taquilla
BackstageAPI Nest, Prisma, Neon, panel staff, bandeja coms
SoporteHosting, DNS, backups Neon
EvidenciasSolicitud NEW en BD, estados, seed exposiciones
FallosAPI caída → error UI + teléfono; clave staff filtrada → rotar STAFF_KEY; contenido viejo → owner editorial
RecuperaciónReintentar; canal telefónico documentado

Riesgos de investigación

  • No validado con docentes reales.
  • Rivera/sede es constructo de diseño.
  • Supuesto de “sin checkout” puede frustrar si el museo ya vende online.

03-information-architecture.md

Abrir documento

03 — Arquitectura de información · ATRIO

Mapa del sitio (público)

/ (Home)
├── /exposiciones
│   └── /exposiciones/:slug
├── /visita
├── /entradas?exhibitionId?
├── /staff                    [interno, clave]
└── (footer) Aviso / Privacidad / Accesibilidad — copy legal stub
TipoItems
PrincipalExposiciones, Visita
CTAEntradas
FooterContacto, Staff (discreto), legal
ContextualDesde ficha → Visita / Entradas (con exhibitionId)

Taxonomía exposiciones

DimensiónValores
statusCURRENT, UPCOMING, PAST
typeTEMPORARY, PERMANENT, INSTALLATION
publishedboolean
roomtexto libre (Sala 2, Planta 1…)
fechasstartsOn, endsOn (null = permanente abierta)

Inventario de contenido

TipoOwnerPrioridadUpdateVisibilidad
ExposiciónComunicaciónMustPor aperturapublished
VisitInfoOperacionesMustEstacionalpúblico API
VisitRequestSistema + staffMustTiempo realstaff only list
LegalLegalShouldAnualfooter

Matriz de permisos

RolMóduloVerCrearEditarEliminarAprobar
Público anónimoExposiciones publicadas
PúblicoVisitInfo
PúblicoVisitRequest✅ (propio lead)
Staff (clave)VisitRequest list/statusestadoCONTACTED/CLOSED
Admin CMSExposicionesCould v2CouldCouldCould

Nota v1: no hay auth de usuario final; staff = shared secret STAFF_KEY (documentar rotación en prod).

04 — Flujos de usuario · ATRIO

F1 — Descubrir y abrir exposición

EntradaHome, nav Exposiciones, deep link slug
Pasos1 Home/listado → 2 Filtro opcional → 3 Card → 4 Detalle
PrerrequisitosExposición published
ÉxitoFicha legible + CTAs
ErroresAPI down → banner reintentar; slug 404 → mensaje + link listado
Analíticapage_view, exhibition_list_view, exhibition_view, filter_apply

F2 — Plan de visita

EntradaNav Visita, CTA desde home/detalle
Pasos1 Carga visit-info → 2 Lee bloques → 3 CTA entradas
ErroresFallo API → error + reintentar
Analíticavisit_plan_view, cta_click

F3 — Solicitar entradas / grupo

Entrada/entradas, CTA, query exhibitionId
Pasos1 Form → 2 Validación cliente → 3 POST → 4 Success
Camposname*, email*, phone, visitDate, partySize*, requestType*, message, exhibitionId
TiposINDIVIDUAL, GROUP, SCHOOL
ErroresValidación, 400 exhibition, 5xx red
RecuperaciónMensaje + teléfono recepción
Analíticavisit_request_start, submit success/error

F4 — Staff gestiona solicitudes

Entrada/staff (footer)
Pasos1 Clave → 2 Cargar → 3 Filtrar → 4 PATCH status
Errores401 clave; red
SalidaLista actualizada

Estados de producto

EstadoDóndeComportamiento
Empty listado/exposiciones, homeCopy + link visita
Loadinglistados, visita, staffTexto/skeleton
Error redtodosBanner + reintentar
ValidaciónformMensajes
SuccessformConfirmación sin auto-redirect
404 fichadetalleMensaje + volver
401 staffstaff“Clave incorrecta”

Diagrama de flujo (textual)

[Home] → [Exposiciones] → [Detalle] → [Visita] → [Entradas] → [Success]
                ↓                         ↑           ↓
             [Empty]                   [Error]    [Staff lista]

05 — Modelo de datos · ATRIO

Diagrama ER (simplificado)

Exhibition 1───* VisitRequest

Exhibition

CampoTipoNotas
idcuid PK
slugstring uniqueURL
title, subtitlestring
summary, bodytextlistado / detalle
coverImagestringpath público /images/…
typeenum TEMPORARY|PERMANENT|INSTALLATION
statusenum CURRENT|UPCOMING|PAST
startsOndate
endsOndate?null permanente
room, curatorstring?
publishedboolean default true
createdAt, updatedAtdatetime

Índices: slug unique; (published, status); startsOn.

VisitRequest

CampoTipoNotas
idcuid PK
name, emailstringPII
phonestring?PII
visitDatedate?
partySizeint1–200
requestTypeenum INDIVIDUAL|GROUP|SCHOOL
messagetext?
statusenum NEW|CONTACTED|CLOSED default NEW
exhibitionIdFK?
createdAtdatetime

Índices: status+createdAt; email (búsqueda futura).

VisitInfo

Config estática en API (no tabla v1): horarios, precios, dirección, a11y, contacto.

Privacidad y retención

  • VisitRequest = datos personales: base servicio público + consentimiento form.
  • Retención propuesta: 24 meses luego borrado o anonimización.
  • TLS; no logs de body en prod; staff key no es sustituto de IAM completo.

Datos sensibles

DatoClasificaciónControl
email, phone, namePIIacceso staff + BD
STAFF_KEYsecretoenv only
DATABASE_URLsecretoenv only

06 — Stack tecnológico · ATRIO

CapaElecciónJustificación
FrontendAngular 19 standalone + TailwindStack fijo del cron; SPA editorial
BackendNestJS 11Stack fijo; módulos por dominio
ORMPrisma 6Migraciones claras sobre Neon
BDNeon PostgreSQLMCP + serverless
Auth públicoNinguna v1Nivel 1 alcance
Auth staffHeader x-staff-key / env STAFF_KEYSuficiente demo; prod → IAM
EmailStub / logSin proveedor en v1
Hosting recomendadoWeb estático (Vercel/Netlify) + API Node (Railway/Fly); opcional grok.me vía Build Mode oficial
Assets/public/images + case assets/exhibitionsMisma media Paper/app

Decisiones

  • Apps independientes apps/api y apps/web (sin npm workspaces — lección COMAL).
  • CORS http://localhost:4200.
  • API base hardcodeada en dev; en prod usar environment file.

07-creative-direction.md

Abrir documento

07 — Dirección creativa · ATRIO

Mood candidates: gallery, mineral, chapel, editorial, bookish
Mood chosen: gallery — pure white × cadmium red

Por qué no el primer instinto (mineral/bookish): evita el look “café cultural genérico” y el industrial naranja de COMAL; el rojo de cartelería de museo da carácter institucional.

RolHexReferente
Background#FFFFFFMuro de galería
Surface#F5F5F5Pedestal / ficha
Ink#0A0A0ATexto de cartela
Muted#5C5C5CSecundario
Border#E5E5E5Marco fino
Primary#D41F26Cadmium red cartelería
Primary strong#A8181EHover CTA
Primary soft#FDECECBadge / soft

Type: Cormorant Garamond (display editorial) + Karla (UI humanista)
Dirección: cartelería, mucho aire, acento rojo solo en CTA y labels, fotos reales de salas, radios 2–4px (casi poster, no app pill).

08-design-system.md

Abrir documento

08 — Design system · ATRIO

Fuente de verdad: tokens Paper + tailwind.config.js + este doc.

Tokens

Colores, type, spacing, radius: ver Paper CSS variables y 08 alineado a §07.

Componentes

ComponenteVariantesNotas
Navdesktop / mobileLogo ATRIO + links + CTA Entradas
FooterContacto + staff discreto
Buttonprimary (rojo), secondary (outline ink)Hover strong
Badgecurrent (rojo soft), neutralEstado expo / solicitud
Exhibition cardhome grid, listado 2 colImagen 4:3 cover obligatoria
Form fieldinput, select, textarea + label + errorLabels asociados
Empty stateCopy + CTA visita
Error banner+ reintentar
Loadingtext / skeleton rects
Staff list rowstatus actions

Spacing scale

4 / 8 / 12 / 16 / 24 / 32 / 48 / 64

No usar

Pills excesivas, gradientes 2019, emoji como iconos, placeholders grises como foto.

09-content-guide.md

Abrir documento

09 — Guía de contenido · ATRIO

Voz y tono

  • Institucional cercano, sin jerga startup ni “¡imprescindible!”.
  • Preferir verbos claros: ver, planificar, solicitar, reintentar.
  • Tratar de “tú” en UI ES (o “usted” si el museo lo exige; v1 usa tú cercano / neutro en labels formales).

Nomenclatura

UIUsarEvitar
CTA principalEntradas / Solicitar visitaBuy now / Book now
ListadoExposicionesShows / Events genérico
StaffSolicitudes de visitaLeads CRM

Fechas

Formato legible: “12 mar – 28 jun 2026”. En UI Angular: es locale short.

Microcopy errores

  • Red: “No pudimos cargar… Reintentá o llamá al +598 4622 3400.”
  • Validación email: “Revisá el correo.”
  • Staff 401: “Clave de staff incorrecta.”

Imágenes

Alt descriptivo de sala/obra genérica: “Sala de cerámica con vitrinas y luz puntual”, no “imagen1”.

No lorem

Copy de Museo Municipal de Rivera (constructo).

10-accessibility.md

Abrir documento

10 — Accesibilidad · ATRIO (WCAG 2.2 AA objetivo)

Requisitos de diseño e implementación

TemaCriterio
ContrasteInk #0A0A0A sobre blanco ≥ 4,5:1; CTA rojo con texto blanco verificado
FocoOutline visible en links, botones, inputs
TecladoFormulario y nav usables sin ratón
LabelsTodo input con <label for>
ErroresTexto, no solo color
Imágenesalt significativo en covers y hero
TouchTargets ≥ 44px en mobile
SkipEnlace “Saltar al contenido” recomendado en layout (impl. si falta)
StaffMisma base a11y; password field con label
MovimientoSin animaciones esenciales; hover scale suave opcional

Exclusiones

No se declara certificación formal WCAG; es objetivo de diseño + checklist QA.

11-privacy-security.md

Abrir documento

11 — Privacidad y seguridad · ATRIO

Datos personales

VisitRequest: name, email, phone, message, visitDate → PII.

  • Servicio público de acceso a la cultura + consentimiento del formulario.
  • Informar en política de privacidad (stub footer hasta texto legal real).

Controles técnicos

Controlv1
TLSObligatorio en prod
Secretos.env no git
StaffSTAFF_KEY rotatorio; no es OAuth
Validaciónclass-validator en API
CORSOrigen web explícito
LogsNo body de form en prod
Retención24 meses (decisión de diseño)

Amenazas

  • Enumeración de staff key → rate limit + rotación.
  • Spam de form → captcha Could.
  • XSS → Angular sanitiza; no HTML en body de expo desde admin no autenticado.

12 — Analítica · ATRIO

North Star

visit_request_submit con success=true / semana.

Eventos

EventoProps
page_viewpath
exhibition_list_viewcount, filter?
exhibition_viewslug, status
visit_plan_view
cta_clickfrom, to
visit_request_startrequestType
visit_request_submitrequestType, partySize, success
visit_request_errorcode
staff_listcount
staff_status_changefrom, to

Implementación v1

Instrumentación documentada; wiring real (Plausible/GA) opcional en handoff. Priorizar que el producto funcione.

13 — Plan de pruebas · ATRIO

Casos Must

IDCasoEsperado
Q1GET /exhibitions3 seed, solo published
Q2Filtro status=CURRENTSubconjunto correcto
Q3GET slug inexistente404
Q4GET /visit-info200 con horarios
Q5POST request válido201 NEW
Q6POST email inválido400
Q7GET staff sin key401
Q8GET staff con keylista
Q9PATCH CONTACTEDstatus actualizado
Q10Home API downerror + reintentar
Q11Form successUI confirmación
Q12Listado vacío (filtro)empty copy
Q13Teclado en formtab order razonable
Q14Contraste CTAvisual
Q15Imágenes cargancovers visibles

Regresión

Tras cada cambio de schema o rutas, repetir Q1–Q9 smoke.

14 — Handoff desarrollo · ATRIO

Repos y enlaces

ArtefactoURL / path
Caseux-projects/2026-08-01-atrio/
Paperhttps://app.paper.design/file/01KYY20FFWZAN9PPH1RFEGJFVB
Apphttps://github.com/Criscode2022/atrio-app
Neonproject bold-union-69609498, db neondb

Arranque local

cd atrio-app/apps/api && cp .env.example .env  # DATABASE_URL, STAFF_KEY
npm i && npx prisma migrate dev && npx prisma db seed
npm run start:dev   # :3001

cd ../web && npm i && npm start  # :4200

API contract

MethodPathAuth
GET/exhibitions?status=public
GET/exhibitions/:slugpublic
GET/visit-infopublic
POST/visit-requestspublic
GET/visit-requests?status=x-staff-key
PATCH/visit-requests/:id/statusx-staff-key

Tokens → Tailwind

atrio-red #D41F26, ink #0A0A0A, muted #5C5C5C, surface #F5F5F5, fonts Cormorant + Karla.

Assets

Copiar case/assets/exhibitions/*apps/web/public/images/ (ya en repo).

Prod checklist

  • API URL en environment Angular
  • CORS_ORIGIN
  • STAFF_KEY fuerte
  • Neon pooler URL
  • HTTPS

15 — Roadmap · ATRIO

FaseAlcanceEstado
v1Web pública + API + solicitudes + staff clave + Paper/docs calidad completaEste case
v1.1Email transaccional real; rate limit form; skip-linkNext
v2CMS exposiciones autenticado; roles staff
v2.1Partner ticketing / pago
v3Colección digital, agenda educativa, i18n ES/CA/EN

16-interaction-specs.md

Abrir documento

16 — Especificación de interacciones · ATRIO

ElementoInteracción
Nav linkHover underline / color primary
Card expoHover título → primary; imagen scale 1.03 500ms
CTA primaryHover primary-strong; active press
Form submitdisabled + “Enviando…”; evita doble envío
SuccessSin redirect auto; botones nueva solicitud / ver expos
Error bannerPersistente hasta reintentar o éxito
Staff filtersRecarga lista con status
Staff actionsOptimistic o reload fila; busy por id
Filtros listadoInstant; loading breve
Focusoutline 2px ink o primary

Duraciones: hover 150–200ms; image scale 500ms ease.

17-prototype-map.md

Abrir documento

17 — Mapa de prototipo · ATRIO

Paper = hi-fi estático. Prototipo vivo = Angular.

Home ──┬── Exposiciones ── Detalle ──┬── Visita ── Entradas ── Success
       │                             └── Entradas(?exhibitionId)
       ├── Visita
       ├── Entradas
       └── Staff (clave)
Estados: Empty · Loading · Error red · 404 detalle · 401 staff
DesdeAcciónHacia
Home cardclickDetalle
Detalle CTAEntradasForm
NavVisitaPlan
FooterStaffPanel
SuccessInicioHome

18-completeness-audit.md

Abrir documento

18 — Auditoría de completitud · ATRIO

Cierre calidad: 2026-08-01 (elevación a barra §6.1)
Alcance de producto: Nivel 1 · Calidad: completa (paritaria)

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
8Journey maps02 (A/B/C)
9Service blueprint02
10Arquitectura de información03
11Matriz de permisos03
12Flujos prioritarios04 + 17
13Modelo de datos05
14Stack06 + implementación
15Dirección creativa07
16TokensPaper + 08 + Tailwind
17Design systemPaper DS + 08
18Pantallas hi-fi19 artboards Paper (flujo + mobile + staff + 404 + validación)
19Estados y edge casesPaper + Angular
20ResponsiveDesktop + mobile Paper/app
21Spec interacciones16 + 17
22Guía de contenido09
23Accesibilidad10
24Privacidad y seguridad11
25Plan analítico12
26Plan de pruebas13
27Handoff14
28Roadmap15
29Presentación ejecutivapresentation/
30Registry + memoryactualizados
31Código productoatrio-app vertical slice + staff

Autoverificación §29

PreguntaResultado
Concepto distinto de COMAL✅ cultura vs hostelería
Problema concreto y usuarios
Alcance acorde a L1 sin bajar calidad✅ barra §6.1
Flujos principales completos
Empty / load / error / recovery
Contenido realista
Identidad visual propia✅ gallery red
Componentes reutilizables
Responsive diseñado
A11y AA objetivo✅ diseño + labels
Modelo de datos soporta casos
Stack justificado
Privacidad y riesgos
Métricas
Pruebas
Handoff implementable
Presentación clara
Paper hi-fi real

Deuda residual (no bloqueante)

  1. Deploy producción / grok.me solo vía Build Mode oficial.
  2. Email real y captcha.
  3. CMS exposiciones.
  4. Investigación de campo.

Declaración

ATRIO se declara completo en calidad de portfolio y vertical slice Nivel 1, con profundidad documental y de estados elevada a la barra del cron §6.1.

19-backlog-completo.md

Abrir documento

19 — Backlog · ATRIO

Must (v1) — hecho

  • Catálogo y ficha exposiciones
  • Plan de visita
  • Formulario solicitudes + confirmación
  • Estados empty/loading/error
  • Seed 3 exposiciones + imágenes
  • Staff list/status con STAFF_KEY
  • Docs 00–20 profundidad portfolio
  • Paper flujo + responsive + estados

Should

  • Email transaccional
  • Rate limit + captcha form
  • Skip link global
  • CMS exposiciones

Could

  • Colección digital
  • Agenda educativa
  • i18n

Won’t ahora

  • Checkout de pago
  • App nativa
  • Multi-museo SaaS

20-implementation.md

Abrir documento

20 — Implementación · ATRIO

ItemValor
Repohttps://github.com/Criscode2022/atrio-app
Neonbold-union-69609498 / main / neondb
API:3001 Nest + Prisma
Web:4200 Angular + Tailwind
STAFF_KEY localatrio-staff-dev

Rutas web

/, /exposiciones, /exposiciones/:slug, /visita, /entradas, /staff

Vertical slice verificado

  • Exhibitions CRUD read + seed
  • Visit info
  • Visit request create
  • Staff list + status patch
  • UI estados

Arranque

cd /Users/cristian/orca/atrio-app && npm run api && npm run web