Investigación y documentación

Documentación · RELE

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

En esta página Day brief — 2026-08-09 — ALS-2 0%

Day brief — 2026-08-09 — ALS-2

1. LOAD — restricciones del día

EjeDecisiónMotivo (diversidad)
ComplejidadNivel 2Tras VOLTA (L1 fitness) no se repite L1. L2 = multi-rol JWT, CRUD de entidad core + máquina de estados + stats.
SectorEnergía / consumo domésticoPrimera vez en la serie (fitness, agro, mascotas, logística, legal, mayores, salud, museo, cocina). Prioridad en cola §6.2 memory.
Tipo de productoPanel de lecturas de contador multi-rolTool ops RESIDENT + ADVISOR; no lead form público + inbox staff (anti-patrón post-VOLTA).
AuthJWT multi-rol RESIDENT + ADVISORDirectiva D-P1-05; todo el dominio de lecturas detrás de JWT.
Craft mínimo≥ VOLTA / SURCO densificadoL2 no baja craft visual ni profundidad de docs (D-P0-01).
Cierre§1.1 completo en una iteraciónDocs + Paper + app + Neon + smoke; sin “próximos pasos del L2 del día”.
Puerto API3009Evitar colisión con VOLTA (3008) y SURCO (3007).
IDAnti-patrónMitigación hoy
AP-thin-docsDocs de 1–2 líneasSuite 00–20 con tablas, AC y criterios de aceptación
AP-generic-uiUI “SaaS genérico” / “básica porque L2”Palette maritime fog × navy × sea × coral; Sora + Nunito Sans
AP-no-authPanel sin loginJWT obligatorio en /api/readings*
AP-marketplace-copyLógica de marketplace / checkoutNo catálogo, no ratings, no matching de proveedores
AP-lead-form-onlySolo form público + inbox staff (VOLTA-like)Ambos roles autenticados; residente crea lecturas, asesor revisa
AP-fitness-agroReutilizar dominio de días previosEnergía hogar; Reading + Home + CUPS
AP-fake-researchEstadísticas inventadas como primariasSolo hipótesis y supuestos etiquetados
AP-open-debtBacklog de features del L2 del díaVertical slice cerrado: home, login, list+stats, create, detail+status
AP-canvas-chaosPaper sin bandas §§1 UX · §2 Design+Public · §3 App · §4 Mobile · §5 States

Barra de calidad actual (ratchet)

  • Paper: bandas §1–§5, ≥8 artboards UX densos + DS + app + mobile + states.
  • Angular alineado a tokens (fog/navy/sea/coral; no default Tailwind genérico).
  • API Nest + Prisma + Neon con seed demo usable (2 users, 1 home, 5 readings).
  • Smoke: login RESIDENT + POST reading + login ADVISOR + list + patch status; ng build o serve OK.
  • Docs en español, profundidad tipo portfolio (no stubs).

2. BRIEF — concepto del día

CampoValor
NombreRELE
Eslogan”El consumo, a la vista.”
Una frasePanel de lecturas de contador del hogar (kWh / periodo) con roles residente y asesor energético.
TipoTool ops L2 — lecturas multi-rol (no marketplace, no lead form-only, no fitness/agro)
RolesRESIDENT (Elena Marín) · ADVISOR (Toni Gil)
DominioUser + Home + Reading (DRAFT | SUBMITTED | REVIEWED | FLAGGED)
EstiloFog #EEF1F4 × Navy #0C2340 × Sea #2F8F8C × Coral #E07A5F
TipoSora (display) + Nunito Sans (UI)
StackAngular + NestJS + Prisma + Neon + Tailwind + JWT
Paperhttps://app.paper.design/file/01KZJNCCMJ1FDHHPZZ923RWDWY
Neonsparkling-snow-59844541 · API :3009 · Web :4200
App/Users/cristian/orca/rele-app/ · GitHub Criscode2022/rele-app

Por qué L2 energía (y no otra cosa)

  1. Diversidad de sector: la serie no había tocado energía / sostenibilidad del hogar (primera de la cola memory §6.2).
  2. Complejidad L2 justa: dos roles con vistas filtradas, máquina de estados de lectura, create solo RESIDENT, patch status solo ADVISOR, stats con kWh agregados.
  3. Diferenciación vs VOLTA: VOLTA es form público + inbox coach; RELE es tool autenticado multi-rol (ambos JWT, no lead-form-only).
  4. Diferenciación vs SURCO: SURCO es cuaderno agro de parcelas/tareas; RELE es consumo energético (kWh, periodo, CUPS, nota de asesor).
  5. Metáfora de marca: rele evoca relé eléctrico / “releer” el contador; promesa de claridad del consumo, no de marketplace energético ni de app fitness.

Must-have del día (alcance L2)

#EntregaCriterio done
1Home marketingHero real, 3 pasos, CTAs por rol, footer demo
2Login JWTRESIDENT y ADVISOR; redirect a /lecturas
3Lista lecturas + statsFiltro por rol; chips de estado; kWh Σ; empty/error
4Nueva lectura (solo RESIDENT)period, kWh, costEur opcional, notes
5Detalle + PATCH status (solo ADVISOR)REVIEWED / FLAGGED + advisorNote
6Empty / errorSin lecturas; fallo de red en lista
7Paper §1–§5UX process + DS + app + mobile + states
8Docs 00–20 + README + executivePortfolio ES, sin stubs

Explicitamente fuera de alcance (no son deuda del día)

  • Integración con contadores inteligentes / API de distribuidora
  • Facturación, pagos o cambio de comercializadora
  • Multi-vivienda avanzada / multi-tenant asesoría
  • Gráficos históricos avanzados / forecasting
  • Notificaciones email/SMS/push
  • App nativa offline-first
  • Compliance regulatorio (CNMC, etc.) como producto

3. Directivas activas aplicadas

IDAplicación en RELE
D-P0-01L2 no reduce craft ni profundidad de docs
D-P0-02Hi-fi con media real (assets/hero.jpg), microcopy energía hogar
D-P0-03Angular + Nest + Neon + Tailwind + repo app
D-P0-04Canvas Paper en bandas §1–§5 con labels
D-P0-05Hero fotorrealista en case y app
D-P0-06Cierre §1.1 sin backlog del alcance L2
D-P1-01≥8 artboards UX en Paper (stakeholders → datos)
D-P1-02Tokens fog/navy/sea/coral en Angular
D-P1-03apps/api + apps/web independientes
D-P1-05JWT en todas las rutas de lecturas
D-P1-06Smoke login + GET/POST/PATCH readings

4. Cuentas demo

RolNombreEmailPassword
RESIDENTElena Maríncasa@rele.energypassword123
ADVISORToni Gilasesor@rele.energypassword123

Seed de referencia: vivienda Piso Ruzafa (C/ Sueca 18, 3º · València · CUPS ES0021000000000001AB); 5 Reading con códigos RE-0809-0105 (estados REVIEWED, SUBMITTED, FLAGGED).

Supuestos (no investigación primaria)

  • Hogares y asesores energéticos coordinan lecturas por WhatsApp, Excel y capturas de contador.
  • El residente necesita un historial por periodo con referencia corta.
  • El asesor necesita una cola de revisión con nota y estados claros (ok / revisar tarifa).

5. Criterio de cierre del día

  • Brief de diversidad y anti-patrones documentado
  • Producto definido (no marketplace, no fitness, no agro, no lead-form-only)
  • Implementación runnable API :3009 / web :4200
  • Documentación portfolio 00–20 + presentation + README
  • Paper file enlazado y referenciado por bandas
  • Hipótesis vs investigación marcadas (sin stats falsas)

Estado del brief: listo para EXECUTE y entrega de caso.

00-paper-reference.md

Abrir documento

Referencia Paper — RELE

CampoValor
File ID01KZJNCCMJ1FDHHPZZ923RWDWY
URLhttps://app.paper.design/file/01KZJNCCMJ1FDHHPZZ923RWDWY
NombreRELE — Daily UX 2026-08-09
ProductoPanel lecturas kWh multi-rol RESIDENT + ADVISOR (L2)
Artboards~22 (+ labels de banda)
Bandas§1 UX · §2 Design + Public · §3 App · §4 Mobile · §5 States
Idioma UIes-ES
Mediaassets/hero.jpg (contador / entorno doméstico energía)

1. Mapa de canvas (bandas jerárquicas)

§BandaPropósitoArtboards clave
1UX PROCESSInvestigación y modelo de servicio (densidad visual)Cover, Stakeholders, Personas, JTBD, Journey, Blueprint, IA, Datos
2DESIGN + PUBLICSistema visual y cara públicaDesign System, Home marketing, Login
3APPFlujos autenticados desktopLecturas list + stats, Nueva lectura, Detalle
4MOBILEMóvil residente / asesor en visitaList / create mobile
5STATESResiliencia UIEmpty lecturas, Error red

Layout canvas (referencia): origen (0,0) · gaps ~80px · bandas Y orientativas: UX ~100 / Design ~2180 / App ~3980 / Mobile ~4880 / States ~5680.


2. Inventario de artboards

§1 — UX PROCESS

LabelNombreContenido
1-0§1 UX PROCESSEtiqueta de banda
2-0UX-00 CoverPortada RELE, eslogan, fecha 2026-08-09, L2 energía, roles, navy + sea
3-0UX-01 StakeholdersMapa interés/influencia: residente, asesor, familia, comercializadora (bajo), regulador (fuera v1)
4-0UX-02 PersonasElena Marín (RESIDENT) · Toni Gil (ADVISOR) — goals, pains, quote
5-0UX-03 JTBDJob principal + funcional/emocional/social + MoSCoW / stories Must
6-0UX-04 Journey5 fases residente: descubre → entra → registra lectura → espera revisión → ve nota
7-0UX-05 BlueprintFrontstage panel · backstage asesor · sistemas Neon/JWT · fallos red/estado
8-0UX-06 IASitemap público/auth; navegación y permisos por rol
9-0UX-07 DatosERD: User, Home, Reading + enums Role, ReadingStatus

§2 — DESIGN + PUBLIC

LabelNombreContenido
A-0§2 DESIGN + PUBLICEtiqueta de banda
B-000 Design SystemColor fog/navy/sea/coral, tipo Sora+Nunito Sans, botones, badges estado, cards
C-001 HomeNav, hero + media, 3 pasos, CTAs rol, footer demo
D-002 LoginSplit navy/form; email/password; hint demo

§3 — APP (desktop)

LabelNombreContenido
E-0§3 APPEtiqueta de banda
F-003 LecturasLista + stats (total, abiertas, kWh Σ); badge rol; CTA nueva (RESIDENT)
G-004 Nueva lecturaForm period / kWh / coste / notas
H-005 DetalleCódigo RE-…, kWh, coste, estado, notas, acciones ADVISOR

§4 — MOBILE

LabelNombreContenido
I-0§4 MOBILEEtiqueta de banda
J-006 Mobile list / newVista ~390px; touch targets ≥44px

§5 — STATES

LabelNombreContenido
K-0§5 STATESEtiqueta de banda
L-007 EmptySin lecturas; CTA registrar (RESIDENT)
M-008 ErrorFallo de carga / red; reintento

3. Checklist de densidad (anti thin-frames)

Criterio§1 UX§2 DS/Public§3–4 App§5 States
Jerarquía tipográfica visible
Microcopy real (no lorem)
Tokens de color aplicados
Datos de seed creíblesPersonasDemo emailsCódigos RE-…Empty realista
Media / iconografíaCoverHeroBadgesAlertas

4. Mapeo Paper → Angular

ArtboardRuta appComponente
C-0 Home/HomePage
D-0 Login/loginLoginPage
F-0 Lecturas/lecturasReadingsPage
G-0 Nueva/lecturas/nuevaReadingNewPage
H-0 Detalle/lecturas/:idReadingDetailPage
J-0 Mobilemismas rutas, viewport estrechoresponsive
L-0 Empty/lecturas (0 items)empty state en lista
M-0 Errorlecturasmensajes error en página

5. Tokens de diseño en Paper

TokenValorUso
Fog / bg#EEF1F4Fondo de página
Surface#FFFFFFCards, header
Navy / ink#0C2340Primary dark, texto fuerte, CTAs navy
Navy soft#D8E4F0Fondos suaves / secciones
Navy strong#071628Hover / énfasis
Sea#2F8F8CAcento marca, CTAs primarios mar
Sea soft#D4EDECBadges REVIEWED, nota asesor
Sea strong#247370Hover sea
Coral#E07A5FAlertas, FLAGGED, abiertas
Coral soft#F8E4DDFondos error / flag
Muted#5A6B7DTexto secundario
Border#D0D8E0Bordes cards
DisplaySoraTítulos
UINunito SansCuerpo y UI

6. Notas de handoff visual

  • Badges de estado: DRAFT muted · SUBMITTED navy soft · REVIEWED sea · FLAGGED coral.
  • Login split: panel izquierdo navy con claim; form a la derecha sobre fog/surface.
  • Stats strip: TOTAL | ABIERTAS (coral) | kWh Σ (sea soft).
  • Código de lectura siempre monospaced o tracking-wide en sea: RE-MMDD-XXX.

01-project-definition.md

Abrir documento

01 — Definición de proyecto — RELE

1. Identidad

CampoValor
NombreRELE
SignificadoRelé eléctrico + “releer” el contador: el consumo deja de ser opaco
Eslogan”El consumo, a la vista.”
Una frasePanel de lecturas de contador del hogar (kWh por periodo) con revisión del asesor energético.
SectorEnergía / sostenibilidad del hogar
TipoTool ops multi-rol JWT — Nivel 2
PlataformaWeb responsive (móvil residente + desktop asesor)
Mercado demoEspaña (vivienda en València en seed)
Idiomaes-ES
Fecha caso2026-08-09

2. Problema

Principal ([HIPÓTESIS] de diseño)

Los hogares y asesores energéticos gestionan lecturas de contador por WhatsApp, Excel y capturas borrosas. El residente no tiene un historial con referencia; el asesor no tiene una cola con estado (enviada / revisada / a revisar) ni nota estructurada.

Secundarios

ProblemaQuién lo sufreEfecto
“Te mando foto del contador” en hilosResidenteNo hay acuse ni código de referencia
Hojas sueltas / Excel localAsesorDifícil priorizar revisiones del mes
Sin periodo ni kWh estructuradosAmbosLlamadas de ida y vuelta
Sin máquina de estadosAsesorSe pierde qué ya se validó o se marcó anómalo

Supuestos (no investigación primaria propia)

  • S1 [SUPUESTO]: Hogares y asesorías pequeñas no necesitan un EMS industrial; sí un panel de lecturas con estado.
  • S2 [SUPUESTO]: El residente prefiere registrar periodo + kWh en 1 pantalla a crear tickets genéricos.
  • S3 [SUPUESTO]: El valor inmediato está en captura estructurada + pipeline de revisión, no en IoT ni cambio de comercializadora.

Hipótesis de producto

IDHipótesisSeñal de validación (futura)
H1Un form de lectura con periodo y kWh reduce capturas ambiguas↓ “¿de qué mes era?” post-envío
H2Inbox con estados SUBMITTED→REVIEWED/FLAGGED acelera el cierre de revisiónMediana tiempo SUBMITTED→REVIEWED
H3Códigos cortos RE-MMDD-XXX facilitan referencia oralUso del código en WhatsApp/llamada
H4Nota de asesor visible para el residente cierra el loop de confianza% lecturas con advisorNote leída

No se afirman estadísticas de mercado inventadas. Todo lo anterior es razonamiento de diseño etiquetado.

3. Propuesta de valor

ParaValor
Residente (Elena)Registra kWh por periodo, ve histórico y notas del asesor.
Asesor (Toni)Cola de revisiones, marca REVIEWED o FLAGGED con nota.
Asesoría / hogarCanal digital mínimo viable sin marketplace ni EMS enterprise.

No es RELE

ExcluidoPor qué
Marketplace de tarifas o comercializadorasMatching multi-proveedor ≠ tool de lecturas
App fitness / club / lead form (VOLTA)Dominio y patrón de producto distintos
Cuaderno agro / flota / legalDominios de otros días de la serie
SaaS multi-tenant con billing IoTComplejidad L3/L4
Integración contador inteligente nativaFuera del job “lectura a la vista” v1

4. Objetivos

Negocio / caso de estudio

  • Demostrar vertical slice L2 energía con JWT multi-rol y dominio Reading + Home.
  • Portfolio coherente: Paper + docs + app runnable.

Usuario

RolObjetivo medible en demo
ResidenteCrear lectura en < 2 min; ver código RE-… en lista
AsesorMarcar REVIEWED / FLAGGED en < 3 taps desde el detalle

No objetivos v1 (explícitos)

  • Lectura automática del contador / OCPP / API distribuidora
  • Comparador de tarifas con contratación
  • Multi-vivienda con permisos granulares por hogar
  • Chat in-app
  • Export contable fiscal

5. Roles y permisos (resumen)

AcciónPúblicoRESIDENTADVISOR
Ver home marketing
Login JWT
Listar lecturasNoPropiasTodas (demo)
Ver stats summaryNoPropiasGlobales
POST lecturaNoNo (403)
Ver detalleNoSi residentId propio
PATCH status + advisorNoteNoNo (403)

6. Métricas (modelo, no instrumentadas en v1 salvo base)

TipoMétricaDefinición
North StarLecturas REVIEWED / mesRevisiones realmente cerradas
Activación1ª lectura SUBMITTED del residentePOST create
Ops% SUBMITTED revisadas en 7 díasSUBMITTED → REVIEWED/FLAGGED
Calidad datos% FLAGGED / totalSeñal de anomalía o tarifa
UXTiempo form completeMediana en analytics futuro

7. Alcance funcional v1 (L2)

MóduloIncluido
Home públicaHero, 3 pasos, CTAs rol, footer demo
AuthPOST /api/auth/login → JWT accessToken
LecturasGET list, GET stats, GET by id, POST create, PATCH status
UI estadosLoading implícito, empty, error de red
Seed2 users, 1 home, 5 readings

8. Criterios de aceptación de producto

  1. Un residente autenticado puede crear una lectura (period + kWh) y recibir un código RE-….
  2. Sin token, GET/POST/PATCH /api/readings* responden 401.
  3. Un asesor puede iniciar sesión, ver la cola completa y stats (total, open, kwhTotal).
  4. El detalle permite al asesor transicionar a REVIEWED o FLAGGED con nota opcional.
  5. El residente no puede PATCH status (403); el asesor no puede POST create (403).
  6. La home comunica energía hogar y claridad de consumo, no marketplace ni fitness.

9. Stack y artefactos

CapaDetalle
FrontendAngular + Tailwind · puerto 4200
BackendNestJS · puerto 3009
DBNeon PostgreSQL · Prisma · project sparkling-snow-59844541
AuthJWT (passport/strategy en API)
DiseñoPaper 01KZJNCCMJ1FDHHPZZ923RWDWY
Repo app/Users/cristian/orca/rele-app/ · GitHub Criscode2022/rele-app

10. Riesgos y mitigaciones

RiesgoImpactoMitigación v1
Expectativa de lectura automáticaDecepciónCopy “registras la lectura”; sin IoT
Confundir con comparador de tarifasExpectativa marketplaceMarca panel de lecturas, no matching
PII + CUPS en lecturasPrivacidadSolo JWT; doc 11; seed demo
kWh mal tipadosDatos basuraValidación @IsNumber() @Min(0) server
Confundir FLAGGED con error técnicoAnsiedad usuarioMicrocopy “revisar tarifa / anomalía” en guía de contenido

02-ux-research-strategy.md

Abrir documento

02 — Estrategia de investigación UX — RELE

Importante: este documento contiene artefactos de diseño y razonamiento secundario.
No hay entrevistas de campo primarias ni estadísticas inventadas presentadas como dato medido.
Etiquetas: [COMPROBADO] en producto, [SUPUESTO], [HIPÓTESIS], [DECISIÓN DE DISEÑO].

1. Objetivos de investigación (del caso)

ObjetivoMétodo en este casoSalida
Entender roles hogar + asesoría energéticaModelado de stakeholders + personas§3–4
Definir job principalJTBD + stories Must§5
Mapear fricción de coordinaciónJourney + service blueprint§6–7
Traducir a requisitos L2Matriz hallazgo → requisito → feature§8

2. Fuentes y límites

Fuentes admisibles (secundarias / operativas)

  • Conocimiento general de consumo doméstico (factura, contador, periodo de facturación).
  • Analogía operativa con tools multi-rol de la serie (SURCO tareas, FIRME casos) — no copiar dominio.
  • Restricciones ALS-2 de diversidad (sector energía libre; no marketplace; no lead-form-only; no fitness/agro).

Límites éticos de verdad

ProhibidoPermitido
“El 68% de hogares pierde lecturas por WhatsApp” sin fuente[SUPUESTO] la coordinación informal es frecuente en asesoría doméstica”
Citas de usuarios ficticios como entrevistas realesQuotes de persona etiquetadas como constructo de diseño
NPS inventadoHipótesis H1–H4 con métrica futura

3. Stakeholders

StakeholderInfluenciaInterésNecesidad principal
Residente titular (RESIDENT)AltaMuy altaRegistrar y ver consumo por periodo
Asesor energético (ADVISOR)Media–AltaAltaCola de revisión y cierre con nota
Familia convivienteBaja formalMediaEntender picos (fuera de multi-user v1)
ComercializadoraMedia potencialBaja en v1No es marketplace ni integración
Regulador / CNMCAlta potencialBaja en v1Fuera de alcance L2 (no simular compliance)
Fabricante de contadoresBajaBajaIoT fuera de v1

Mapa de poder (resumen)

  • Decisor de adopción en hogar: RESIDENT (titular de la vivienda / factura).
  • Usuario frecuente de revisión: ADVISOR.
  • Riesgo de rechazo: si la app pide más datos que un Excel sin devolver claridad de estado y nota.

4. Personas

P1 — Elena Marín · RESIDENT

CampoDetalle
Edad / contexto~38 años; piso en Ruzafa (València); trabaja híbrido
DigitalAlta (banca, apps); poca paciencia con formularios largos
GoalsTener el consumo “a la vista”; no perder lecturas en el chat
PainsCapturas de contador; no sabe si el asesor ya miró el mes
Quote de diseño“Si no está en el panel, no cuentes con que lo he mandado.”
Email democasa@rele.energy

Escenario: A mediados de agosto registra la lectura de 2026-08 (245 kWh), ve código RE-… y espera REVIEWED o nota FLAGGED.

P2 — Toni Gil · ADVISOR

CampoDetalle
Edad / contexto~44 años; asesor energético independiente / pequeña asesoría
DigitalMedia–alta; prefiere desktop para revisión, móvil en visita
GoalsVer cola SUBMITTED, validar o flaggear, dejar nota útil
PainsExcel mezclado; no sabe qué ya revisó; sin CUPS a mano
Quote de diseño“Dame periodo, kWh y CUPS. Yo marco si hay que revisar tarifa.”
Email demoasesor@rele.energy

Escenario: Abre RELE, filtra abiertas, entra en RE-0809-03, marca REVIEWED o FLAGGED con nota.

Anti-persona

QuiénPor qué no es target v1
Operador de EMS industrial multi-sedeNecesita SCADA, multi-tenant y SLAs → L3/L4
Usuario solo “comparar tarifas y contratar”Producto marketplace/comparador, no lecturas
Coach de club deportivoDominio VOLTA; no energía

5. JTBD y user stories

Job principal

Cuando llega el cierre de periodo o la visita del asesor,
quiero registrar o revisar lecturas de contador con kWh y estado,
para tener el consumo a la vista sin perseguirse por WhatsApp.

Jobs secundarios

JobRol
Ver cuántas lecturas abiertas hayAmbos (scope distinto)
Dejar una nota de revisión legibleADVISOR
Referir una lectura por código corto en llamadaAmbos

Stories Must (v1)

IDStoryAC resumido
E1Como usuario, inicio sesión con email/password y recibo JWT200 + accessToken; 401 si mal
E2Como RESIDENT, listo mis lecturas y un summary (total, open, kwhTotal)GET list + stats filtrados
E3Como ADVISOR, listo todas las lecturas de la demoGET sin filtro resident
E4Como RESIDENT, creo lectura con period y kWhPOST; status SUBMITTED; code RE-…
E5Como ADVISOR, cambio estado a REVIEWED o FLAGGED con notaPATCH status + advisorNote
E6Como RESIDENT, no puedo PATCH status403
E7Como visitante, entiendo el valor en la homeCTAs “Soy residente / Soy asesor”

Should / Could (fuera de L2 del día, no deuda)

  • Selector multi-vivienda.
  • Gráfico de tendencia kWh.
  • Adjunto foto del contador.
  • Notificaciones al marcar FLAGGED.
  • Filtros UI por estado.

6. Journey — mes de Elena (happy path)

FaseAcciónPensamientoTouchpointEmoción
1 DescubreLlega a la home RELE“¿Esto sustituye el Excel?”/Curiosidad
2 EntraLogin casa@…“Mis datos, no un form anónimo”/loginConfianza
3 Registraperiod + kWh + coste“En un minuto lo dejo”/lecturas/nuevaAlivio
4 EsperaVe SUBMITTED en lista“Toni lo verá”/lecturasNeutra
5 Cierra loopVe REVIEWED + nota“Tiene sentido el pico de AC”/lecturas/:idSatisfacción

Journey asesor (paralelo)

FaseAcciónTouchpoint
Loginasesor@…/login
ColaStats abiertas + lista/lecturas
RevisiónDetalle kWh/CUPS/lecturas/:id
CierreREVIEWED o FLAGGED + notaPATCH

7. Service blueprint (resumen)

CapaElementos
FrontstageHome, login, lista, form, detalle
Backstage humanoAsesor interpreta picos, decide flag
SistemasAngular :4200 · Nest :3009 · Prisma · Neon · JWT
SoporteSeed demo, códigos RE-…, badges estado
FallosRed caída → error + reintento; 403 por rol; 401 sin token

8. Matriz hallazgo → requisito → feature

IDHallazgo (tipo)RequisitoFeature L2
F1Coordinación informal pierde contexto [SUPUESTO]Captura estructurada period+kWhPOST /api/readings
F2Asesor necesita cola priorizable [HIPÓTESIS]Lista + open countGET list + stats
F3Cierre de revisión debe ser explícito [HIPÓTESIS]Estados REVIEWED/FLAGGEDPATCH status
F4Confianza del residente en feedback [HIPÓTESIS]Nota visibleadvisorNote en detalle
F5Referencia oral en llamada [SUPUESTO]Código corto únicocode RE-MMDD-XXX
F6Ambos roles necesitan auth [DECISIÓN]JWT multi-rollogin + guards
F7Vivienda ancla CUPS [DECISIÓN]Entidad Homeseed + include en list

9. Preguntas abiertas (investigación futura, no bloqueantes)

  1. ¿El asesor gestiona N hogares o 1:1 en la práctica real de la demo extendida?
  2. ¿DRAFT se usa en flujo real o basta SUBMITTED al crear? ([DECISIÓN v1]: create → SUBMITTED; DRAFT en enum para evolución.)
  3. ¿costEur lo rellena el residente o se estima? ([DECISIÓN v1]: opcional en form.)

10. Síntesis para diseño

PrincipioAplicación en UI
Claridad del númerokWh y periodo prominentes; stats kWh Σ
Honestidad de estadoBadges DRAFT/SUBMITTED/REVIEWED/FLAGGED
Roles sin ambigüedadCTA home dual; acciones create vs patch por rol
ReferenciaCódigo RE-… siempre visible
Marca marítima calmadaFog/navy/sea; coral solo para alerta

Cierre de verdad: ninguna cifra de mercado en este doc es primaria. Las personas y journeys son constructos de diseño para alinear producto, Paper y código.

03-information-architecture.md

Abrir documento

03 — Arquitectura de información — RELE

1. Principios de IA

PrincipioAplicación
Poca profundidadMáx. 2 niveles bajo auth (/lecturas → detalle o nueva)
Roles en el mismo shellMismas rutas; acciones condicionales por role
Público vs appHome marketing abierta; dominio lecturas solo JWT
Códigos como anclaRE-… visible en lista y detalle
No marketplaceSin catálogo, carrito ni matching

2. Sitemap

/                         Home marketing (público)
/login                    Login JWT (RESIDENT | ADVISOR)
/lecturas                 Lista + stats (auth)
/lecturas/nueva           Crear lectura (RESIDENT; auth)
/lecturas/:id             Detalle + acciones ADVISOR (auth)
/**                       → redirect /

3. Navegación

Pública

ElementoDestinoNotas
Logo RELE/Display Sora
Entrar/loginLink muted
Abrir panel/loginCTA sea
Soy residente / Soy asesor/loginMismo form; seed distinto

App autenticada (header)

ElementoVisibleAcción
LogoAmbos/lecturas
Nombre · rolAmbosSolo lectura
Nueva lecturaSolo RESIDENT/lecturas/nueva
SalirAmboslogout + /login o /

4. Inventario de pantallas

IDPantallaRutaAuthRol
S0Home/NoPúblico
S1Login/loginNo
S2Lecturas/lecturasAmbos
S3Nueva lectura/lecturas/nuevaRESIDENT
S4Detalle/lecturas/:idAmbos (scope)

5. Objetos de contenido

ObjetoCampos clave en UIDónde
Readingcode, period, kwh, costEur, status, notes, advisorNoteLista, detalle, form
Homelabel, address, cupsDetalle, subtítulo lista
Username, email, roleHeader, login
Statstotal, open, byStatus, kwhTotalStrip lista

6. Taxonomía de estados

StatusSignificado UXColor sugerido
DRAFTBorrador (reservado; no create v1)muted
SUBMITTEDEnviada, pendiente de revisiónnavy soft
REVIEWEDRevisada OK por asesorsea
FLAGGEDRequiere atención (tarifa / anomalía)coral

Open (ops): SUBMITTED + FLAGGED (contador “ABIERTAS” en stats).

7. Permisos por ruta (matriz)

Ruta / acciónAnónimoRESIDENTADVISOR
GET home
POST login
GET lecturaspropiastodas
GET statspropiasglobales
POST lectura
GET detalle ajeno
PATCH status

8. Etiquetado y copy de nav (es-ES)

UILabel
ProductoRELE
LoginIniciar sesión / Entrar
ListaLecturas
CreateNueva lectura / Registrar lectura
LogoutSalir
Back← Lecturas

9. SEO / URLs

  • URLs en español legible (lecturas, nueva).
  • IDs técnicos solo en detalle (:id cuid).
  • Sin query params de filtro en v1.

10. Extensiones futuras (no en IA v1)

MóduloRuta hipotéticaNivel
Multi-vivienda/viviendasL2+
Tendencias/lecturas/tendenciaL2+
Perfil/cuentaL2+
Export CSVacción en listaL2+

04 — Flujos de usuario — RELE

1. Mapa de flujos

IDFlujoActorÉxito
F0Descubrimiento homeVisitanteEntiende valor y va a login
F1LoginRESIDENT / ADVISORJWT + redirect /lecturas
F2Consultar lecturas + statsAmbosLista y strip stats
F3Crear lecturaRESIDENTReading SUBMITTED con código
F4Revisar y cambiar estadoADVISORREVIEWED o FLAGGED + nota
F5Empty stateRESIDENT (0 items)CTA a nueva lectura
F6Error de redAmbosMensaje + reintento
F7LogoutAmbosLimpia token

2. F0 — Home → Login

[/] → CTA "Soy residente" | "Soy asesor" | "Abrir panel"
    → [/login]
PasoUINotas
1Hero + media + 3 pasosCopy: sin Excel / WhatsApp
2Click CTAAmbos CTAs a /login (mismo form; [DECISIÓN])
3Login prefill residentecasa@rele.energy por defecto en demo

3. F1 — Login JWT

[/login] → email + password → POST /api/auth/login
  OK → localStorage (rele_token, rele_user) → [/lecturas]
  KO → mensaje "Credenciales inválidas"
CampoValidación clienteServer
emailrequired, type email@IsEmail()
passwordrequired, min práctico@MinLength(6) + bcrypt

Errores

CasoRespuestaUI
Password incorrecta401coral “Credenciales inválidas”
API caídanetwork errormismo mensaje genérico o red

4. F2 — Lista + stats

[/lecturas] (token required)
  → GET /api/readings/stats/summary
  → GET /api/readings
  → render cards + badges
RolDatos
RESIDENTSolo residentId = me; include home + advisor
ADVISORTodas; include home + resident

Soft auth UI: si no hay token → navigateByUrl('/login').

Variantes

EstadoCondiciónUI
Loadingpetición en cursolista vacía / sin empty (loading flag)
Empty200 + []“Sin lecturas todavía” + CTA si RESIDENT
ErrorHTTP errorpanel coral + Reintentar
Successitems ≥ 1lista ordenada createdAt desc

5. F3 — Crear lectura (RESIDENT)

[/lecturas] → "Nueva lectura" → [/lecturas/nueva]
  → period, kwh, costEur?, notes?
  → POST /api/readings
  → OK → [/lecturas] (o detalle según impl.)
  → ADVISOR que intenta POST → 403
CampoReqEjemplo
period2026-08
kwhSí, ≥ 0245
costEurNo56.1
notesNoLectura contador 14 ago

Server [COMPROBADO en código]:

  1. Solo role === RESIDENT.
  2. Resuelve Home del residente (primera o crea default).
  3. status = SUBMITTED, code = RE-MMDD-XXX.

6. F4 — Detalle + status (ADVISOR)

[/lecturas] → click card → [/lecturas/:id]
  → GET /api/readings/:id
  → (si ADVISOR) textarea nota + botones REVIEWED | FLAGGED
  → PATCH /api/readings/:id/status { status, advisorNote? }
  → UI actualiza item
Transición típicaDesdeHacia
Validar OKSUBMITTEDREVIEWED
Anomalía / tarifaSUBMITTED o REVIEWEDFLAGGED
Re-validarFLAGGEDREVIEWED

Permisos

ActorPuede ver detallePuede PATCH
RESIDENT dueñoNo
RESIDENT ajeno403No
ADVISOR

7. F5 — Empty

CondiciónMensajeCTA
RESIDENT 0 lecturas“Sin lecturas todavía…”Registrar lectura
ADVISOR 0 lecturasMismo empty sin CTA create

8. F6 — Error de red (lista)

GET fallan → error string → panel "No se pudieron cargar las lecturas"
  → [Reintentar] → load()

9. F7 — Logout

click Salir → ApiService.logout() → limpia localStorage → login/home

10. Diagrama de estados Reading

        create (RESIDENT)


          SUBMITTED ◄──────────────┐
           /      \                │
          /        \               │
         ▼          ▼              │
     REVIEWED    FLAGGED ──────────┘
         \          /   (PATCH ADVISOR)
          \        /
           ▼      ▼
        (ambos pueden re-etiquetarse vía PATCH libre en v1)

Nota [DECISIÓN]: la API acepta cualquier ReadingStatus en PATCH (enum); no hay máquina de estados rígida server-side más allá de rol ADVISOR. DRAFT existe en enum para evolución, no se emite en create v1.


11. Criterios de aceptación por flujo

FlujoAC
F1Login demo 200; mal password mensaje visible
F2Stats total/open/kwhTotal coherentes con seed
F3POST crea SUBMITTED con code RE-
F4PATCH REVIEWED asigna advisorId
F5Empty sin crash
F6Reintentar re-lanza GETs

05 — Modelo de datos — RELE

1. Visión general

Dominio mínimo de lecturas energéticas L2:

EntidadPropósito
UserIdentidad RESIDENT o ADVISOR
HomeVivienda del residente (label, address, CUPS)
ReadingLectura de contador por periodo con estado y notas

Base: PostgreSQL (Neon) · ORM: Prisma · IDs: cuid().

2. Enums

Role

ValorDescripción
RESIDENTTitular / habitante que registra lecturas
ADVISORAsesor que revisa y anota

ReadingStatus

ValorDescripción
DRAFTBorrador (reservado; no usado en create v1)
SUBMITTEDEnviada por residente (default create)
REVIEWEDRevisada OK por asesor
FLAGGEDMarcada para atención (tarifa / anomalía)

3. Diagrama ER (texto)

User
  id, email, passwordHash, name, role
  homes[] (RESIDENT)
  readings[] (como resident)
  reviews[] (como advisor)

Home
  id, label, address, cups
  residentId → User
  readings[]

Reading
  id, code (unique)
  period, kwh, costEur?, notes, advisorNote
  status (default SUBMITTED)
  homeId → Home
  residentId → User
  advisorId? → User
  createdAt, updatedAt

4. Tablas / modelos Prisma

User

CampoTipoConstraints
idStringPK, cuid
emailStringunique
passwordHashStringbcrypt
nameString
roleRoleRESIDENT | ADVISOR
createdAtDateTimedefault now
updatedAtDateTimeupdatedAt

Home

CampoTipoConstraints
idStringPK, cuid
labelStringej. “Piso Ruzafa”
addressString
cupsStringcódigo punto suministro (demo)
residentIdStringFK User
createdAtDateTime

Reading

CampoTipoConstraints
idStringPK, cuid
codeStringunique, formato RE-MMDD-XXX
periodStringej. 2026-08
kwhFloat≥ 0
costEurFloat?opcional
notesStringdefault ""
advisorNoteStringdefault ""
statusReadingStatusdefault SUBMITTED
homeIdStringFK Home
residentIdStringFK User
advisorIdString?FK User (advisor)
createdAt / updatedAtDateTime

5. Reglas de integridad y negocio

ReglaImplementación
Auth lecturasJwtAuthGuard en controller readings → 401 sin token
Create solo RESIDENTForbiddenException si no RESIDENT
Status solo ADVISORForbiddenException si no ADVISOR
Get RESIDENTSolo si reading.residentId === userId
Código únicocode unique; generación RE- + MMDD + random 100–999
Home en createPrimera home del residente o create default
NotesCoalesce a "" si omitidas
Orden listadocreatedAt desc
PasswordNunca en claro; solo passwordHash

6. Contratos API (resumen)

POST /api/auth/login

Body: { email, password }
Response 200:

{
  "accessToken": "<jwt>",
  "user": { "id": "...", "email": "...", "name": "...", "role": "RESIDENT" }
}

GET /api/readings (JWT)

Array Reading + includes (home, resident|advisor según rol).

GET /api/readings/stats/summary (JWT)

{
  "total": 5,
  "open": 3,
  "byStatus": {
    "DRAFT": 0,
    "SUBMITTED": 2,
    "REVIEWED": 2,
    "FLAGGED": 1
  },
  "kwhTotal": 921
}

open = SUBMITTED + FLAGGED.
kwhTotal = suma de kWh del scope del rol.

GET /api/readings/:id (JWT)

Reading con home + resident + advisor, o 404/403.

POST /api/readings (JWT RESIDENT)

Body

CampoTipoReq
periodstringsí (min 4)
kwhnumbersí ≥ 0
costEurnumberno
notesstringno
homeLabelstringno (solo si se crea home)

Response: Reading + home; status SUBMITTED.

PATCH /api/readings/:id/status (JWT ADVISOR)

Body: { status: ReadingStatus, advisorNote?: string }
Efecto: actualiza status, advisorId = me, advisorNote si se envía.

7. Seed de referencia

EntidadDatos
RESIDENTElena Marín · casa@rele.energy · password123
ADVISORToni Gil · asesor@rele.energy · password123
HomePiso Ruzafa · C/ Sueca 18, 3º · València · CUPS ES0021000000000001AB
RE-0809-012026-07 · 212 kWh · 48.6 € · REVIEWED
RE-0809-022026-06 · 168 kWh · 39.2 € · REVIEWED
RE-0809-032026-08 · 245 kWh · 56.1 € · SUBMITTED
RE-0809-042026-05 · 141 kWh · 33.4 € · FLAGGED
RE-0809-052026-04 · 155 kWh · 36.0 € · SUBMITTED

8. Índices y rendimiento (v1)

NecesidadEnfoque v1
List by residentwhere residentId (volumen demo bajo)
Unique codeconstraint unique Prisma
StatsgroupBy status + aggregate kwh

Índices adicionales (residentId, status) = L2+ si crece volumen.

9. Privacidad de campos

CampoSensibilidadQuién lo ve
emailPIIself + advisor en list
cupsidentificador suministroambos roles en scope
passwordHashsecretonunca en API response
advisorNotesemi-sensibleambos en detalle

06 — Stack tecnológico — RELE

1. Resumen

CapaTecnologíaNotas
FrontendAngular (standalone components)Puerto 4200
EstilosTailwind CSSTokens en tailwind.config.js
BackendNestJSPrefijo global /api, puerto 3009
ORMPrismaschema en apps/api/prisma
DBNeon PostgreSQLproject sparkling-snow-59844541
AuthJWT (Bearer)accessToken en login
Validaciónclass-validator + ValidationPipewhitelist + transform
Repo/Users/cristian/orca/rele-app/GitHub Criscode2022/rele-app

2. Estructura monorepo app

rele-app/
├── package.json              # scripts api / web
├── apps/
│   ├── api/                  # NestJS
│   │   ├── prisma/
│   │   │   ├── schema.prisma
│   │   │   └── seed.ts
│   │   ├── src/
│   │   │   ├── auth/
│   │   │   ├── readings/
│   │   │   ├── prisma/
│   │   │   ├── app.module.ts
│   │   │   └── main.ts
│   │   └── package.json
│   └── web/                  # Angular
│       ├── src/app/
│       │   ├── core/api.service.ts
│       │   └── pages/...
│       ├── tailwind.config.js
│       └── package.json
└── README.md

[DECISIÓN / D-P1-03]: apps independientes (npm install --prefix), sin workspaces npm que rompan Angular.

3. Frontend

AspectoDetalle
ComponentesStandalone + templates inline
Routingapp.routes.ts
HTTPHttpClient vía ApiService
Estado authlocalStorage keys rele_token, rele_user
API basehttp://localhost:3009/api
FontsGoogle Fonts Sora + Nunito Sans en styles.css

Rutas web

PathPágina
/HomePage
/loginLoginPage
/lecturasReadingsPage
/lecturas/nuevaReadingNewPage
/lecturas/:idReadingDetailPage

4. Backend

AspectoDetalle
Prefijo/api
CORSorigin: true, credentials
Puertoprocess.env.PORT || 3009
MódulosAuthModule, ReadingsModule, PrismaModule

Endpoints

MétodoRutaAuthRol
POST/api/auth/loginNo
GET/api/readingsJWTambos
GET/api/readings/stats/summaryJWTambos
GET/api/readings/:idJWTscope
POST/api/readingsJWTRESIDENT
PATCH/api/readings/:id/statusJWTADVISOR

5. Base de datos

CampoValor
ProviderPostgreSQL
HostingNeon serverless
Projectsparkling-snow-59844541
URLDATABASE_URL en .env (no commitear secretos)
Seedprisma/seed.ts → 2 users, 1 home, 5 readings

6. Auth JWT

PiezaRol
Loginbcrypt compare + sign JWT
Payloadsub/userId, email, role
GuardJwtAuthGuard en ReadingsController
Strategypassport-jwt Bearer
Clienteheader Authorization: Bearer <token>

7. Variables de entorno

VariableServicioDescripción
DATABASE_URLAPIConnection string Neon
JWT_SECRETAPIFirma de tokens
PORTAPIOpcional, default 3009

Web: URL API fija en api.service.ts (localhost:3009) en v1.

8. Scripts habituales

cd /Users/cristian/orca/rele-app
npm install --prefix apps/api
npm install --prefix apps/web
npm --prefix apps/api run prisma:migrate
npm --prefix apps/api run prisma:seed
npm run api    # :3009
npm run web    # :4200

9. Decisiones técnicas

DecisiónRazón
Puerto 3009Diversidad vs VOLTA 3008 / SURCO 3007
Soft guards en AngularAutoridad real en API; L2 simple
Create → SUBMITTEDMenos fricción que DRAFT+submit
Stats con kwhTotalDominio energía visible en strip
Templates inlineVelocidad daily; componentes autocontenidos
accessToken camelCaseAlineado a SURCO; evita snake_case mismatch

10. Dependencias clave (orientativo)

APIWeb
@nestjs/*@angular/*
@prisma/clienttailwindcss
passport-jwtrxjs
bcrypt
class-validator

11. Despliegue (recomendado, no obligatorio v1)

CapaOpción
APIRailway / Fly / Render
WebVercel / Netlify / static ng build
DBNeon (ya)

Documentar CORS y API URL de producción al desplegar.

07-creative-direction.md

Abrir documento

07 — Dirección creativa — RELE

1. Concepto de marca

CampoValor
NombreRELE
Eslogan”El consumo, a la vista.”
PromesaClaridad calmada del gasto energético del hogar, con un asesor en el loop.
TonoTécnico-humano, sereno, mediterráneo marítimo — no alarmista “eco-green” ni industrial cold.
MetáforaRelé / relectura del contador: un clic mental que enciende visibilidad.

2. Posicionamiento visual

EjeRELE eligeRELE evita
TemperaturaMarítimo frío-cálido (navy + sea + coral)Lime athletic (VOLTA), leaf pastoral (SURCO)
DensidadCards generosas, números legiblesDashboard IoT denso con 40 KPIs
EmociónConfianza y calmaUrgencia climática panic-red
ReferenciaPanel de energía doméstica / asesoríaMarketplace, fitness, agro

3. Personalidad (adjetivos)

  1. Clara — kWh y periodo primero.
  2. Serena — fog y navy, no neon cyber.
  3. Precisa — códigos RE-…, CUPS, estados.
  4. Cercana — microcopy de piso y factura, no jerga de TSO.
  5. Honesta — FLAGGED no es “error del usuario”.

4. Paleta (ancla)

NombreHexRol
Fog#EEF1F4Fondo
Surface#FFFFFFCards
Navy#0C2340Ink / primary dark
Sea#2F8F8CAcento marca / CTAs
Coral#E07A5FAlerta / FLAGGED / abiertas
Muted#5A6B7DSecundario
Border#D0D8E0Separadores

Mood: costa mediterránea al atardecer suave — niebla marina, azul profundo, agua, terracota suave.

5. Tipografía

UsoFamiliaPeso
Display / logos / H1Sora600–800
UI / cuerpoNunito Sans400–700

Por qué: Sora da geometría moderna energética sin frío tech; Nunito Sans aporta legibilidad amable en formularios y listas.

6. Imaginería

UsoDescripción
HeroContador / entorno doméstico de energía fotorrealista (assets/hero.jpg)
EmptyTipografía + CTA, sin ilustración clipart
No usarIconos de rayo cartoon, paneles solares stock genéricos a full-bleed sin contexto

7. Motion (principios)

Principiov1
SutilHover de cards y botones
Sin confettiÉxito = lista actualizada / badge
Feedback estadoCambio inmediato de badge tras PATCH

8. Voz visual por pantalla

PantallaÉnfasis
HomeClaim grande + hero + dual CTA
LoginSplit navy / form; promesa de roles
ListaNúmeros y badges; strip stats
FormCampos claros, un CTA sea
DetalleGrid kWh / coste / estado; nota sea soft

9. Diferenciación en la serie

ProyectoEstiloRELE se diferencia
VOLTAChalk/ink/lime · fitnessNo lime; no lead form
SURCOBone/leaf · agroNo pastoral; energía
CORREASage/terracotta · petsNo marketplace
TROCHAAsphalt/amber · logNo flota

10. Anti-moodboard (qué no)

  • Gradientes “AI SaaS purple”.
  • Glassmorphism excesivo.
  • Dark mode full como default (login split navy sí; app en fog).
  • Iconografía de rayo amarillo genérico de stock.

11. Criterio de aceptación creativa

  1. Un screenshot de home se reconoce como “energía hogar serena”, no gym ni finca.
  2. Tokens Tailwind coinciden con Paper (fog/navy/sea/coral).
  3. Hero real presente en case y app.
  4. Coral solo en alerta / flag / open — no en brand principal.

08-design-system.md

Abrir documento

08 — Design system — RELE

1. Tokens de color

Token TailwindHexUso
bg#EEF1F4Fondo página
surface#FFFFFFCards, header
ink#0C2340Texto principal
ink-muted#5A6B7DTexto secundario
primary#0C2340Navy primary
primary-soft#D8E4F0Secciones suaves
primary-strong#071628Hover navy
sea#2F8F8CCTA principal, acentos
sea-soft#D4EDECBadge REVIEWED, nota asesor
sea-strong#247370Hover sea
coral#E07A5FFLAGGED, errores, abiertas
coral-soft#F8E4DDFondos error
border#D0D8E0Bordes

Contraste (orientativo WCAG)

ParUsoNota
ink sobre bgCuerpoAlto
white sobre seaBotonesAlto
white sobre inkBotones navyAlto
white sobre coralBotones flagAlto
ink-muted sobre bgSecundarioVerificar ≥ 4.5:1 en UI real

2. Tipografía

RolFamiliaClaseTamaños guía
DisplaySorafont-displayH1 4xl–5xl · H2 3xl · logo 2xl
UINunito Sansfont-sansbody base · labels xs bold · meta 11px

Tracking: labels de sección tracking-[0.16em] en sea/uppercase corto.

3. Espaciado y layout

TokenValor
Page maxmax-w-6xl home · max-w-5xl lista · max-w-2xl detalle/form
Header height72px home · 64px app
Card radiusrounded-2xl (16px) · botones rounded-full
Gap seccionespy-14 home · py-8 app
Padding cardp-4 / p-6

4. Componentes

4.1 Botones

VarianteClases claveUso
Primary searounded-full bg-sea text-white font-boldCTA principal
Primary inkrounded-full bg-ink text-whiteCTA secundario fuerte
Outlinerounded-full border border-border bg-surfaceCTA alternativo
Danger/Flagrounded-full bg-coral text-whiteFLAGGED
Ghost textfont-bold text-inkSalir

Estados: hover sea-strong / opacidad; disabled no implementado en v1 salvo implícito form.

4.2 Badges de estado

StatusEstilo sugerido
DRAFTmuted border
SUBMITTEDbg-primary-soft text-ink
REVIEWEDbg-sea-soft text-sea
FLAGGEDbg-coral-soft text-coral

4.3 Cards

  • Border border-border, fondo surface, hover lista hover:border-sea.
  • Meta code: text-[11px] font-bold tracking-wide text-sea.
  • Título: period · kWh · coste muted.

4.4 Stats chips

ChipContenidoAcento
TOTALcountink
ABIERTASopencoral text
kWh ΣkwhTotalsea soft bg

4.5 Formularios

ElementoSpec
Labeltext-xs font-bold text-ink-muted
Inputrounded-xl border border-border px-4 py-3 w-full
Textarearows 2–3, mismo borde
Errortext-sm text-coral

4.6 Header app

Logo display + Nombre · ROL + acciones. Sticky no obligatorio en app (sí en home marketing).

4.7 Empty / Error

TipoContenedor
Emptyrounded-2xl border bg-surface p-12 text-center
Errorrounded-2xl border-coral/40 bg-coral-soft p-6 + botón Reintentar ink

5. Iconografía

v1: sin librería de iconos pesada; chevron/back como texto “←”.
Extensión L2+: set outline navy/sea coherente.

6. Elevación y bordes

NivelTratamiento
Flatborder only
Hero mediashadow-lg + rounded-[20px]
Sticky header homebg-surface/95 + border-b

7. Grid responsive

BreakpointComportamiento
< md1 col hero, form full
md+hero 2 col; login split 2 col; stats row
Mobile listacard full width; targets ≥ 44px

8. Mapeo Paper ↔ código

Token PaperTailwind
Fogbg-bg
Navytext-ink / bg-ink / primary
Seabg-sea / text-sea
Coralbg-coral / text-coral
Sorafont-display
Nunito Sansfont-sans

9. Do / Don’t

DoDon’t
Usar sea para acción primaria de productoUsar coral como brand principal
Números en extrabold displayPárrafos largos en H1
Badges de estado siempreInventar estados “OK/KO” fuera del enum
Fog de fondo appFondo blanco puro full-bleed sin surface cards

10. Checklist de paridad

  • Colores en tailwind.config.js
  • Fonts en styles.css
  • Badges en lista
  • Login split navy
  • Stats strip

09-content-guide.md

Abrir documento

09 — Guía de contenido — RELE

1. Voz y tono

AtributoCómo suena RELECómo no suena
Clara“Registra la lectura del periodo.”“Optimiza tu stack energy-as-a-service.”
Serena“El consumo, a la vista.”“¡Tu factura te está arruinando!”
Precisa“245 kWh · SUBMITTED”“Mucho consumo este mes 😱”
Cercana“Piso Ruzafa”“Nodo de suministro N-42” sin contexto
Honesta“Marcar FLAGGED — revisar tarifa”“Error: lectura inválida” si solo es duda de tarifa

Idioma: es-ES. Tratamiento de tú implícito en CTAs cortos; sin vosotros institucional.

2. Nombres de producto

CorrectoEvitar
RELEReleApp, Rele Energy Suite
Lectura / lecturasTicket, lead, solicitud de plaza
Residente / AsesorUser / Admin genéricos en UI
Periodo“Billing cycle” en UI
kWh“Consumo units”

3. Microcopy por pantalla

Home

ElementoCopy
EyebrowENERGÍA · HOGAR
H1El consumo, a la vista.
LeadLecturas de contador y revisión del asesor energético en un solo panel. Sin Excel sueltos ni capturas por WhatsApp.
CTA 1Soy residente
CTA 2Soy asesor
Paso 01Registras la lectura — Periodo, kWh y coste estimado de la factura.
Paso 02El asesor revisa — Marca REVIEWED o FLAGGED con una nota.
Paso 03Queda en el histórico — Código corto para referir en una llamada.

Login

ElementoCopy
Panel izq.Panel de lecturas del hogar
SubResidente envía kWh. Asesor valida y anota.
Título formIniciar sesión
ErrorCredenciales inválidas
Hint democasa@rele.energy · asesor@rele.energy · password123

Lista

ElementoCopy
H1Lecturas
Sub RESIDENTTu histórico de contador
Sub ADVISORCola de revisión energética
StatsTOTAL · ABIERTAS · kWh Σ
Empty titleSin lecturas todavía
Empty bodyCuando registres un periodo, aparecerá aquí.
Empty CTARegistrar lectura
Error titleNo se pudieron cargar las lecturas
Error CTAReintentar

Nueva lectura

Campo / UICopy
TítuloNueva lectura
periodPeriodo (ej. 2026-08)
kwhkWh
costEurCoste estimado (€) — opcional
notesNotas
SubmitEnviar lectura

Detalle

ElementoCopy
Back← Lecturas
LabelskWh · COSTE · ESTADO · NOTAS RESIDENTE · NOTA ASESOR
CTA seaMarcar REVIEWED
CTA coralMarcar FLAGGED
Placeholder nota(textarea libre)

4. Estados — lenguaje para humanos

CódigoLabel UI (v1)Explicación corta (tooltips futuros)
DRAFTDRAFTBorrador no enviado
SUBMITTEDSUBMITTEDEnviada; pendiente de revisión
REVIEWEDREVIEWEDRevisada por el asesor
FLAGGEDFLAGGEDAtención: tarifa o anomalía

[DECISIÓN v1]: se muestran códigos de estado en inglés de dominio (enum) para alinear API/UI; la guía de contenido documenta significado en español. L2+ puede localizar a “Enviada / Revisada / A revisar”.

5. Códigos y datos

TipoFormatoEjemplo
Código lecturaRE-MMDD-XXXRE-0809-03
PeriodoYYYY-MM preferido2026-08
kWhnúmero245
CosteN €56.1 €
CUPSstring demoES0021000000000001AB

6. Mensajes de error

CasoMensaje
Login failCredenciales inválidas
Red listaNo se pudieron cargar las lecturas + detalle técnico corto si hay
403 create(API) Forbidden — UI no muestra botón a ADVISOR
403 patch(API) Forbidden — UI no muestra botones a RESIDENT
404(futuro) Lectura no encontrada

7. Accesibilidad de texto

  • No usar solo color para estado: badge con texto del enum.
  • Alt hero: “Contador y entorno doméstico de energía”.
  • Evitar “clic aquí”; preferir verbos de acción.

8. Tono en notas (asesor)

BuenoMalo
“Pico coherente con ola de calor.”“Mal.”
“Revisar tarifa PVPC vs fija.”“Eres tonto con la tarifa.”
“Dentro de rango.”“OK lol”

Incluir en home o login los emails demo sin passwords en marketing largo; password solo en hint de login/demo interno.

10. Checklist de contenido

  • Eslogan único y consistente
  • CTAs duales por rol
  • Empty y error con acción
  • Notas de seed creíbles (no lorem)
  • Sin copy de marketplace / fitness / agro

10-accessibility.md

Abrir documento

10 — Accesibilidad — RELE

1. Objetivo

Orientar el vertical slice L2 a WCAG 2.2 AA en lo razonable para una app daily de portfolio: contraste, teclado, labels, estados no solo-color, y mensajes de error.

No se declara certificación formal AA. Esto es checklist de diseño e implementación.

2. Principios aplicados

PrincipioAplicación en RELE
PerceptibleContraste navy/fog; badges con texto; alt en hero
OperableTargets ≥ 44px en CTAs; formularios nativos
ComprensibleLabels visibles; errores en texto; estados con nombre
RobustoHTML semántico razonable; Angular standalone

3. Contraste

ParUsoMeta
#0C2340 sobre #EEF1F4Texto body≥ 4.5:1
#FFFFFF sobre #2F8F8CBotón sea≥ 4.5:1
#FFFFFF sobre #0C2340Botón ink / login panel≥ 4.5:1
#FFFFFF sobre #E07A5FBotón coral≥ 4.5:1
#5A6B7D sobre fogMutedVerificar; subir a ink si falla

Acción: si muted falla en labels pequeños, usar ink o subir peso.

4. Teclado y foco

ControlExpectativa
Links navTab order lógico logo → entrar → CTA
Loginemail → password → submit
Listacada card es link; Tab entre items
Form nuevacampos en orden DOM → submit
Detalle ADVISORnota → REVIEWED → FLAGGED

Mejora L2+: focus ring visible (focus-visible:ring-2 ring-sea) en todos los interactivos.

5. Formularios

Requisitov1
Label asociado<label> con span + input (implícito wrapping)
requiredatributos HTML en login
Errorestexto coral bajo el form
type email/password
No placeholder-onlylabels siempre visibles

6. Color y estado

RiesgoMitigación
Solo color para statusBadge incluye texto del enum
Coral = error y flagContexto de pantalla distinto + texto
Stats “abiertas” en coralLabel ABIERTAS presente

7. Media

Elementoa11y
Hero homealt="Contador y entorno doméstico de energía"
Decorativeno hay iconos vacíos críticos

8. Estructura semántica

PantallaEstructura
Homeheader + sections + headings jerárquicos
Loginheadings h1/h2; form
Listaheader + main + h1 + lista ul/li
Detallemain + h1 periodo

9. Auth y timeouts

  • No hay timeout de sesión UI en v1; JWT expira según config server.
  • Logout explícito limpia storage.
  • Mensajes de 401 en flujos protegidos: redirect login (soft).

10. Lectores de pantalla (notas)

ÁreaRecomendación
StatsPreferir texto “Total 5” legible; evitar solo dígitos sueltos sin label
BadgesEl texto del status es suficiente
Botones estado“Marcar REVIEWED” es verboso y correcto

11. Mobile

Requisitov1
Touch targetbotones rounded-full con py suficiente
Zoomno bloquear scale en viewport meta de forma hostil
Orientaciónlayout apilado ok

12. Matriz de pruebas a11y (manual)

#PruebaCriterio pass
A1Tab por home y loginFoco no se pierde
A2Login solo tecladoSubmit OK
A3Zoom 200% listaSin solapamiento crítico
A4Contraste botonesTexto legible
A5Empty/errorMensaje en texto, no solo color
A6Badge statusNombre del estado anunciable

13. Deuda a11y aceptada (no bloquea L2)

ÍtemPrioridad
Focus rings sistemáticosL2+
Live regions al patch statusL2+
Route guards + anuncios de páginaL2+
Auditoría axe automatizada en CIL2+
i18n de enums a españolL2+

14. Criterio de aceptación a11y v1

  1. No hay información crítica solo por color.
  2. Hero tiene alt descriptivo.
  3. Forms tienen labels visibles.
  4. Errores de login y lista son textuales.
  5. CTAs principales son alcanzables por teclado.

11-privacy-security.md

Abrir documento

11 — Privacidad y seguridad — RELE

1. Alcance

Vertical slice L2 con datos de consumo doméstico, identidad de usuario y CUPS de demo. Documento de decisiones de producto/seguridad, no dictamen legal.

2. Datos tratados

DatoCategoríaDóndeQuién accede
email, namePIIUserself; advisor ve resident en list
passwordHashsecretoUsernadie vía API
JWTcredencialcliente + serverportador
address, cupsidentificador hogarHomeresident + advisor en scope
period, kwh, costEurconsumo / económicoReadingscope por rol
notes, advisorNotecontenido libreReadingscope por rol

3. Roles y autorización

AcciónRESIDENTADVISOR
Ver propias lecturas
Ver todas (demo)No
Crear lecturaNo (403)
Patch statusNo (403)
Ver lectura ajenaNo (403)

Autoridad: NestJS JwtAuthGuard + checks en ReadingsService.
UI: oculta botones; no sustituye al server.

4. Autenticación

AspectoImplementación
MétodoEmail + password
Hashbcrypt (seed y login)
TokenJWT Bearer accessToken
Storage clientelocalStorage keys rele_token, rele_user
TransporteHTTPS en producción (requerido al desplegar)

Riesgos localStorage [SUPUESTO de amenaza]

RiesgoMitigación v1L2+
XSS roba tokenNo HTML user raw; Angular escape defaultCSP, httpOnly cookie
Token largoSecret fuerte en envExpiry corto + refresh

5. Superficie API

EndpointAuthNotas
POST /api/auth/loginPúblicoRate limit futuro
GET/POST/PATCH readings*JWTValidación DTO
  • Prefijo /api.
  • ValidationPipe whitelist + transform.
  • CORS origin: true en dev; restringir en prod.

6. Secretos y configuración

SecretoUbicación correcta
DATABASE_URL.env local / secret host
JWT_SECRET.env / secret host
Passwords demoSolo docs de demo, no prod real

Nunca commitear .env con credenciales Neon reales en repos públicos sin rotación.

7. Privacidad por diseño (v1)

PrincipioAplicación
MinimizaciónNo DNI, no IBAN, no geolocalización
Limitación finalidadLecturas y revisión; no ads
Transparencia demoCuentas demo visibles en login
Separación roles403 cross-action

8. CUPS y datos energéticos

El CUPS identifica el punto de suministro. En demo es ficticio/seed.

Buena prácticav1
No exponer listados públicos de CUPSJWT required
No loguear bodies con PII en prodconsole mínimo
Soft-deleteNo; hard data en demo

9. Amenazas y mitigaciones

AmenazaImpactoMitigación
Credenciales débiles demoAlto en prod realSolo entorno demo; password123 documentado
IDOR lecturaMediocheck residentId en get
Escalada rol en JWTAltorole firmado en token; no confiar en body
Spam createMedioJWT + validación; rate limit L2+
InyecciónMedioPrisma parametrizado
TemaNota
RGPDBase demo; en producto real: base legal, derechos ARCO, DPA con Neon
Cookiesv1 localStorage no cookie banner; reevaluar si analytics
MenoresNo target

11. Logging y auditoría

Eventov1Futuro
Login failHTTP 401contador / alert
Patch statusDB updatedAt + advisorIdaudit log
ExportNoCSV con authz

12. Checklist seguridad cierre

  • Passwords hasheados
  • JWT en lecturas
  • 403 por rol en create/status
  • 403 resident en get ajeno
  • Validación DTO
  • Rate limit login (L2+)
  • HTTPS enforced en deploy
  • CSP / httpOnly (L2+)

13. Incidente demo (procedimiento mínimo)

  1. Rotar JWT_SECRET y forzar re-login.
  2. Rotar password hashes de seed.
  3. Revisar Neon access.
  4. Documentar en registry si aplica.

12 — Analytics y métricas — RELE

1. Norte del producto

TipoMétricaDefinición
North StarLecturas REVIEWED por mesRevisiones cerradas con valor de asesoría
Guardrail% FLAGGED / totalCalidad o anomalía de datos / tarifa
GuardrailTasa error API create/listConfiabilidad

Instrumentación real (Segment, PostHog, etc.) no está cableada en v1. Este doc define el modelo de medición.

2. Árbol de métricas

North Star: REVIEWED / mes
├── Activación residente: 1ª lectura SUBMITTED
├── Activación asesor: 1er PATCH status
├── Engagement: lecturas / residente / mes
├── Ops: mediana tiempo SUBMITTED → REVIEWED|FLAGGED
└── Calidad: kWh reportados vs outliers (futuro)

3. Eventos propuestos

EventoPropsCuándo
home_viewedload /
login_submittedrole_hint?submit form
login_succeededrole200 login
login_failedreason401
readings_list_viewedrole, totalload lista
reading_createdperiod, kwh, codePOST OK
reading_detail_viewedid, status, roleGET detalle
reading_status_patchedid, from, toPATCH OK
empty_state_viewedroleempty
error_state_viewedsurfaceerror red
logoutroleclick salir

4. Funnels

Funnel residente

  1. home_viewed
  2. login_succeeded (RESIDENT)
  3. reading_created
  4. (async) reading_status_patched → REVIEWED

Funnel asesor

  1. login_succeeded (ADVISOR)
  2. readings_list_viewed
  3. reading_detail_viewed
  4. reading_status_patched

5. KPIs operativos (panel futuro)

KPICálculoFuente
AbiertasSUBMITTED + FLAGGEDstats.summary.open
kWh messum kwh period actualaggregate
SLA revisiónp50 hours SUBMITTED→closetimestamps
Nota coverage% con advisorNote no vacíaDB

6. Analytics de producto vs privacidad

ReglaDetalle
No enviar passwordNunca
Minimizar PII en eventosPreferir user_id hash / role
CUPSNo en analytics v1
IPSegún política host

7. Implementación sugerida L2+

CapaOpción
Product analyticsPostHog self-host o cloud EU
ErroresSentry
Uptime APIBetter Stack / Checkly
SQL métricasNeon + vista readings_by_status

8. Dashboards (wire conceptual)

VistaWidgets
FounderNorth Star, activaciones, error rate
Ops asesorAbiertas, p50 revisión, FLAGGED rate
CalidadDistribución kWh, outliers

9. Experimentos (hipótesis)

ExpHipótesisMétrica
E1Prefill periodo mes actual ↑ create completionreading_created / form start
E2Badge FLAGGED en coral ↑ tiempo a patchtime-to-patch
E3Nota obligatoria en FLAGGED ↑ calidad feedback% note non-empty

Todas las filas son [HIPÓTESIS] hasta A/B real.

10. Qué medir en smoke diario (manual)

CheckSeñal
Seed carga 5 lecturaslista length
Stats open > 0strip ABIERTAS
Create +1 totalPOST
Patch REVIEWEDbadge update

11. Criterio de aceptación analytics v1

  1. Modelo North Star documentado.
  2. Eventos nombrados (aunque no instrumentados).
  3. Funnels de ambos roles definidos.
  4. Sin stats de mercado inventadas presentadas como reales.

13 — Plan de QA — RELE

1. Alcance

Smoke y regresión del vertical slice L2: auth multi-rol, CRUD lecturas, stats, estados UI, tokens visuales.

Entornos: local API :3009 · web :4200 · Neon sparkling-snow-59844541.

2. Cuentas de prueba

RolEmailPassword
RESIDENTcasa@rele.energypassword123
ADVISORasesor@rele.energypassword123

3. Smoke API (obligatorio D-P1-06)

#PasoExpectativa
S1POST /api/auth/login casa@…200 + accessToken + role RESIDENT
S2GET /api/readings con Bearer200 array ≥ 1
S3GET /api/readings/stats/summarytotal, open, byStatus, kwhTotal
S4POST /api/readings period+kwh201/200 · status SUBMITTED · code RE-…
S5Login asesorrole ADVISOR
S6GET /api/readings asesorve lecturas de Elena
S7PATCH /api/readings/:id/status REVIEWED200 · advisorId set
S8Sin token GET readings401
S9RESIDENT PATCH status403
S10ADVISOR POST reading403

Ejemplo curl (orientativo)

# Login residente
TOKEN=$(curl -s -X POST http://localhost:3009/api/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"email":"casa@rele.energy","password":"password123"}' | jq -r .accessToken)

curl -s http://localhost:3009/api/readings -H "Authorization: Bearer $TOKEN" | jq length
curl -s http://localhost:3009/api/readings/stats/summary -H "Authorization: Bearer $TOKEN" | jq .

4. Smoke web

#PasoExpectativa
W1Abrir /Hero, eslogan, CTAs, imagen
W2Ir a loginSplit navy/form
W3Login residenteRedirect /lecturas · nombre Elena · badge RESIDENT
W4Stats visiblesTOTAL / ABIERTAS / kWh Σ
W5Nueva lecturaForm → submit → vuelve lista con item
W6DetallekWh, estado, notas
W7Logout + login asesorCola con nombres residentes
W8Detalle → REVIEWEDBadge actualiza
W9FLAGGED + notaNota visible sea soft
W10Empty (DB limpia opcional)Empty state sin crash
W11API apagadaError + Reintentar

5. Regresión de dominio

CasoResultado
Código único tras varios createsNo colisión (retry manual si 500 raro)
costEur nullMuestra “—” en detalle
notes vacíasNo bloque de notas
Orden listaMás reciente primero

6. Regresión visual / craft

CheckPass
Colores fog/navy/sea/coralNo palette default indigo Tailwind
Fonts Sora + Nunito SansTítulos display
Badges por statusColores distintos
Mobile 390px listaSin overflow horizontal crítico

7. Seguridad básica

CheckPass
password no en responses
401 sin token
403 cross-role
XSS en notesAngular escape; no innerHTML raw

8. Accesibilidad smoke

Ver doc 10 §12 (A1–A6).

9. Build

CheckComando / criterio
API compilenest start / tsc sin error
Web buildng build OK o serve estable
Seedconsola RELE seed OK

10. Matriz de riesgos QA

RiesgoSeveridadDetección
API URL mal puertoAltalista error
Token key mismatch accessTokenAltalogin no guarda
Guard no aplicadoCríticaGET sin token 200
Role check missingCríticaresident patch

11. Criterio de salida QA día

  • S1–S10 o subset documentado en implementation
  • W1–W9 en demo
  • Seed + 2 roles
  • Sin bloqueantes de authz

12. Fuera de alcance QA v1

  • e2e Playwright suite CI
  • Load test Neon
  • Penetration test formal
  • Compatibilidad IE

14 — Handoff de desarrollo — RELE

1. Enlaces canónicos

ArtefactoUbicación
Case/Users/cristian/orca/ux-projects/2026-08-09-rele/
App/Users/cristian/orca/rele-app/
GitHubhttps://github.com/Criscode2022/rele-app
Paperhttps://app.paper.design/file/01KZJNCCMJ1FDHHPZZ923RWDWY
Neonsparkling-snow-59844541
API localhttp://localhost:3009
Web localhttp://localhost:4200

2. Arranque en 5 minutos

cd /Users/cristian/orca/rele-app
cp apps/api/.env.example apps/api/.env   # si existe; si no, crear .env
# DATABASE_URL=...  JWT_SECRET=dev-secret  PORT=3009

npm install --prefix apps/api
npm install --prefix apps/web
npm --prefix apps/api run prisma:migrate
npm --prefix apps/api run prisma:seed
npm run api
npm run web

3. Credenciales demo

RolEmailPassword
RESIDENTcasa@rele.energypassword123
ADVISORasesor@rele.energypassword123

4. Mapa docs → implementación

DocUso para dev
03 IARutas y nav
04 FlowsEdge cases
05 DataSchema + contratos
06 StackPuertos y módulos
08 DSTokens Tailwind
09 ContentStrings UI
11 SecurityAuthz rules
13 QASmoke
16 InteractionsDetalle UI
20 ImplementationArchivos y decisiones

5. Contratos críticos (no romper)

  1. Login response usa accessToken (camelCase).
  2. Todas las lecturas bajo JWT.
  3. POST create → SUBMITTED + code RE-….
  4. PATCH status solo ADVISOR.
  5. Stats incluyen kwhTotal.
  6. Storage keys: rele_token, rele_user.

6. Estructura de código a tocar

CambioArchivos
Nuevo campo lecturaschema.prisma, DTO, seed, Reading type web, UI
Nuevo estadoenum Prisma + badges + stats open formula
Nuevo rolenum Role + service checks + UI condicional
Copytemplates páginas
Tokenstailwind.config.js, styles.css

7. Convenciones

TemaConvención
IDscuid
FechasISO DateTime Prisma; period string YYYY-MM
RolesUPPER enum
StatusUPPER enum
API prefix/api
Idioma UIes-ES

8. Definition of Done (feature nueva)

  • Schema + migrate si aplica
  • Authz test manual
  • UI empty/error si lista
  • Tokens DS
  • Doc 05/04 actualizados si contrato cambia
  • Smoke curl o UI

9. Entorno y secretos

VariableRequerida
DATABASE_URL
JWT_SECRET
PORTNo (3009)

10. Paridad Paper

Implementar respetando:

  • Palette maritime
  • Sora + Nunito Sans
  • Login split
  • Stats strip
  • Badges estado

Inventario: docs/00-paper-reference.md.

11. Problemas conocidos / no-bugs

SíntomaExplicación
Soft auth solo en ngOnInitDeep link sin token redirige; no hay interceptor global
DRAFT no aparece al crearCreate fuerza SUBMITTED
ADVISOR ve todas las lecturasScope demo L2; multi-tenant fuera
Enum en inglés en UIDecisión contenido v1

12. Contacto de diseño (proceso)

Cambios visuales: actualizar Paper + tokens Angular en la misma PR mental del daily. No “solo código gris”.

15 — Roadmap — RELE

1. Principio

El L2 del día está cerrado. Este roadmap solo lista subidas de nivel o extensiones explícitamente fuera del alcance 2026-08-09.
No es deuda del vertical slice actual (CRON §1.1 / D-P0-06).

2. Hecho (L2 — 2026-08-09)

EntregaEstado
Home marketing + heroHecho
JWT multi-rol RESIDENT + ADVISORHecho
Lista + stats (total, open, kwhTotal)Hecho
Create lectura SUBMITTEDHecho
Detalle + PATCH REVIEWED/FLAGGEDHecho
Empty / errorHecho
Seed 5 lecturas + Home + CUPSHecho
Docs 00–20 + Paper + Neon + GitHubHecho

3. L2+ (mismo producto, más craft/ops)

ItemValorEsfuerzo
Filtros por estado en listaOps asesorS
Localizar badges a españolUXS
Focus rings + a11y axeCalidadS
Route guards Angular formalesRobustezS
Interceptor 401 globalAuth UXS
Foto contador (upload)EvidenciaM
Periodo prefill mes actualActivaciónS
Export CSV lecturasOpsM
e2e Playwright smokeCIM

4. L3 (producto más amplio)

ItemNotas
Multi-vivienda por residenteCRUD Home + selector
Asesor multi-cliente / tenantAislamiento datos
Invitaciones y onboardingMagic link
Gráficos tendencia kWhCharts
Notificaciones email al FLAGGEDProvider
Notas hilo (timeline)Historial
Roles ADMIN asesoríaPermisos

5. L4 / exploratorio

ItemNotas
Integración contador inteligente / distribuidoraAPIs externas, consentimientos
Recomendación tarifaria automatizadaNo marketplace checkout sin diseño
App nativa offline-firstSync conflict
Billing de la propia asesoría SaaSMulti-tenant comercial

6. No-roadmap (explícitamente no RELE)

IdeaPor qué no
Marketplace de comercializadorasOtro producto
Fitness / club lead formVOLTA
Cuaderno de parcelasSURCO
Flota GPSTROCHA

7. Priorización sugerida post-demo

PrioridadItemRazón
P1Filtros estado + badges ESUsabilidad ops inmediata
P1Interceptor 401Menos soft-auth frágil
P2Multi-viviendaRealismo dominio
P2Upload fotoConfianza de lectura
P3ChartsStorytelling consumo
P3Integraciones IoTSolo con partner

8. Métricas para decidir build

Señal [HIPÓTESIS]Acción
Asesores piden filtrosL2+ filtros
Residentes confunden FLAGGEDCopy + i18n + tooltip
>1 vivienda por user en entrevistasL3 multi-home
Demanda de foto contadorUpload L2+

9. Criterio de no reabrir L2

No reabrir el case del día para:

  • “Añadir un gráfico pequeño” sin nuevo brief.
  • Cambiar a lead-form público.
  • Mezclar sector fitness/agro.

Cualquier pivot de sector/tipo → nuevo día ALS-2.

16-interaction-specs.md

Abrir documento

16 — Especificaciones de interacción — RELE

1. Convenciones

ParámetroValor
Duración hover~150ms CSS default
Feedback críticoInmediato al response HTTP
NavegaciónAngular router, sin full reload
ToastsNo en v1; UI actualiza in-place

2. Home

InteracciónComportamiento
Hover CTA seahover:bg-sea-strong
Hover CTA outlineborder/ink enfatizado
Click CTAs rol/login
Sticky headersticky top-0 + surface/95
Hero imageobject-cover, no zoom interaction

3. Login

InteracciónComportamiento
Prefillemail residente demo
Submitdisable visual no; espera HTTP
Errormuestra coral bajo form; no limpia password
Successnavigate /lecturas
Link ← Inicio/

4. Lista lecturas

InteracciónComportamiento
Loadparalelo list + stats (subscribe independientes)
Click card/lecturas/:id
Hover cardhover:border-sea
Nueva lectura (RESIDENT)/lecturas/nueva
Salirlogout + clear storage
Reintentarre-ejecuta load()
Empty CTA→ nueva lectura

Badges

StatusClase orientativa (impl.)
SUBMITTEDsoft navy
REVIEWEDsea-soft
FLAGGEDcoral-soft
DRAFTmuted

5. Nueva lectura

InteracciónComportamiento
Campostwo-way ngModel
SubmitPOST; on success volver a lista (o stay — según page impl.)
ValidaciónHTML required en period/kwh; server refuerza
Cancel / backlink a lista

6. Detalle

InteracciónComportamiento
LoadGET by id; 403/404 → vacío o redirect futuro
RESIDENT viewsin botones patch
ADVISOR notetextarea bindeada
Marcar REVIEWEDPATCH status REVIEWED + note
Marcar FLAGGEDPATCH status FLAGGED + note
Success patchitem = response in-place; sin toast

7. Estados de superficie

Loading

Superficiev1
Listaloading=true evita empty flash hasta respuesta
Detalleno skeleton; aparece al next

Empty

CondiciónUI
items.length===0 && !error && !loadingpanel centrado + copy

Error

CondiciónUI
HTTP error listpanel coral-soft + Reintentar
Login errortexto coral

8. Responsive

ViewportAjuste
< mdhero 1 col; login stack (form abajo); stats wrap
≥ mdhero 2 col; login split; stats row
Touchbotones full/rounded-full con padding ≥ 10px vertical

9. Teclado

Atajo implícitoResultado
Enter en loginsubmit form
Tab orderver doc 10
Escno cierra modales (no hay modal v1)

10. Movimiento y reduced motion

v1 no define animaciones custom largas.
L2+: respetar prefers-reduced-motion si se añaden transitions de lista.

11. Edge cases de interacción

CasoComportamiento esperado
Doble click submit createposible double POST; L2+ debounce
Patch concurrentelast write wins
Token expira mid-sessionpróximo GET falla → error/relogin
Deep link detalle sin tokenredirect login

12. Criterios de aceptación interacción

  1. Card hover visible.
  2. Patch actualiza badge sin reload full page.
  3. Error lista recuperable con Reintentar.
  4. Empty no muestra lista fantasma.
  5. ADVISOR no ve botón “Nueva lectura”.

17-prototype-map.md

Abrir documento

17 — Mapa de prototipo — RELE

1. Fuentes de verdad

CapaRol
PaperHi-fi visual + UX process (no clicable nativo vía MCP)
App AngularPrototipo interactivo end-to-end
Docs 00–20Especificación y narrativa portfolio

Paper file: https://app.paper.design/file/01KZJNCCMJ1FDHHPZZ923RWDWY

2. Mapa de clics (app)

[/]
  ├─ Entrar / Abrir panel / Soy residente / Soy asesor → [/login]
  └─ (footer/demo si aplica)

[/login]
  ├─ ← Inicio → [/]
  └─ submit OK → [/lecturas]

[/lecturas]
  ├─ Nueva lectura (RESIDENT) → [/lecturas/nueva]
  ├─ card → [/lecturas/:id]
  ├─ Reintentar → reload
  └─ Salir → login/home + clear

[/lecturas/nueva]
  ├─ back → [/lecturas]
  └─ submit OK → [/lecturas]

[/lecturas/:id]
  ├─ ← Lecturas → [/lecturas]
  └─ (ADVISOR) REVIEWED | FLAGGED → same page update

3. Paper artboard → ruta

ArtboardRutaNotas de paridad
01 Home/Hero, 3 pasos, CTAs
02 Login/loginSplit navy
03 Lecturas/lecturasStats + lista
04 Nueva/lecturas/nuevaForm
05 Detalle/lecturas/:idAcciones advisor
06 Mobilemismasviewport
07 Empty/lecturas0 items
08 Error/lecturasAPI down

4. Guiones de demo (prototipo vivo)

Guión A — Residente (3 min)

  1. Home: leer claim “El consumo, a la vista.”
  2. Login casa@rele.energy / password123.
  3. Señalar stats y códigos RE-0809-….
  4. Nueva lectura periodo actual + kWh.
  5. Abrir detalle; mostrar notas si hay.

Guión B — Asesor (3 min)

  1. Login asesor@rele.energy.
  2. Cola con nombres de residente.
  3. Abrir SUBMITTED.
  4. Nota + FLAGGED o REVIEWED.
  5. Volver a lista; badge actualizado.

Guión C — Resiliencia (1 min)

  1. Parar API.
  2. Reintentar lista → error.
  3. Arrancar API → Reintentar OK.

5. Datos del prototipo (seed)

CódigoPeriodokWhStatus
RE-0809-012026-07212REVIEWED
RE-0809-022026-06168REVIEWED
RE-0809-032026-08245SUBMITTED
RE-0809-042026-05141FLAGGED
RE-0809-052026-04155SUBMITTED

Vivienda: Piso Ruzafa · CUPS ES0021000000000001AB.

6. Limitaciones del prototipo

LimitaciónImpacto demo
Sin guards de ruta Angular formalesDeep link sin token redirige en ngOnInit
Sin notificacionesLoop asesor→residente es visual en detalle
Sin multi-home UIUna vivienda seed
Enum EN en badgesExplicar en narración

7. Checklist de paridad pre-demo

  • API :3009 up + seed
  • Web :4200 up
  • Tokens marítimos visibles
  • Ambos logins
  • Create + patch
  • Paper abierto en segunda ventana opcional

8. Entrega de prototipo

AudienciaQué mostrar
PortfolioPaper §1–§5 + app guión A/B
TechNetwork tab JWT + PATCH
ProductoDiferencia vs marketplace/lead-form

18-completeness-audit.md

Abrir documento

18 — Auditoría de completitud — RELE (2026-08-09)

1. Alcance auditado

Vertical slice L2: lecturas de contador multi-rol RESIDENT+ADVISOR, con docs, Paper, Angular+Nest+Prisma+Neon.

2. Checklist CRON / ALS-2

RequisitoEstadoEvidencia
Diversidad sector/tipo/nivelOKEnergía L2; no fitness/agro/marketplace; no lead-form-only
Day brief + anti-patronesOKdocs/00-day-brief.md
Paper bandas §1–§5OKfile 01KZJNCCMJ1FDHHPZZ923RWDWY
Docs 00–20OKsuite en docs/
JWT multi-rolOKRESIDENT / ADVISOR
API + seed + NeonOKsparkling-snow-59844541, port 3009
Web Angular tokensOKSora/Nunito, fog/navy/sea/coral
Smoke login+readingsOKplan doc 13
Cierre sin deuda del L2OKroadmap solo L2+/L3
Hipótesis no fake statsOKetiquetas en doc 02

3. Cobertura funcional

Feature briefImplementadoUIAPIDocs
Home01,09
LoginPOST login04,06
Lista + statsGET + summary05
CreatePOST04
Detail + statusGET + PATCH04
Empty16
Error red16
Roles demobadgeJWT payloadseed
Home entity + CUPSdetalleinclude05

4. Cobertura Paper

BandaInventarioNotas
§1 UXCover→Datosdoc 00-paper-reference
§2 DS+PublicDS + Home + Logintokens marítimos
§3 AppList + New + Detail
§4 Mobilelist/new
§5 Statesempty + error

5. Rúbrica de calidad (auto SCORE orientativo)

EjeScore 1–5Comentario
Diversidad5Sector energía nuevo; L2 post-VOLTA L1
Craft visual4–5Palette maritime + tipo + hero
Densidad UX docs5Suite completa
Completitud código L24–5Vertical slice runnable
Authz5Guard + role checks create/status
Verdad investigación5Sin stats falsas; hipótesis marcadas

6. Huecos aceptados (no regresiones de cierre)

HuecoClasificación
IoT / contador inteligenteFuera L2
e2e automatizadoPreferible L2+
Route guards formalesL2+
Multi-tenant asesoríaL3
i18n estados ESL2+

7. Anti-patrones verificados

Anti-patrón¿Evitarlo?
Thin docs
UI genéricaSí (tokens)
Sin auth
Marketplace
Lead-form-onlySí (ambos JWT)
Fitness/agro copy
Fake research

8. Veredicto

COMPLETO para entrega de caso 2026-08-09 tras documentación portfolio y app alineada al brief.
Cualquier ampliación multi-tenant/IoT/marketplace requiere nuevo brief de diversidad, no parche silencioso.

19-backlog-completo.md

Abrir documento

19 — Backlog completo — RELE

1. Leyenda

EstadoSignificado
DONEEn el vertical slice L2 del 2026-08-09
OUTFuera de alcance del día (no deuda)
NEXTCandidato L2+/L3 con brief

2. Backlog por épica

E0 — Fundación

IDItemEstado
E0-1Repo app Angular+NestDONE
E0-2Prisma schema User/Home/ReadingDONE
E0-3Neon project + migrate + seedDONE
E0-4JWT loginDONE
E0-5Tokens Tailwind marítimosDONE
E0-6Paper §1–§5DONE
E0-7Docs 00–20 + README + executiveDONE

E1 — Residente

IDItemEstado
E1-1Lista lecturas propiasDONE
E1-2Stats propias + kwhTotalDONE
E1-3Crear lectura SUBMITTEDDONE
E1-4Ver detalle + nota asesorDONE
E1-5Multi-vivienda UIOUT → NEXT L3
E1-6Prefill periodoOUT → NEXT L2+
E1-7Upload foto contadorOUT → NEXT L2+

E2 — Asesor

IDItemEstado
E2-1Cola global demoDONE
E2-2PATCH REVIEWED/FLAGGEDDONE
E2-3advisorNoteDONE
E2-4Filtros por estadoOUT → NEXT L2+
E2-5Asignación multi-clienteOUT → NEXT L3
E2-6SLA dashboardOUT → NEXT L3

E3 — UX craft

IDItemEstado
E3-1Home multi-secciónDONE
E3-2Empty + errorDONE
E3-3Badges estadoDONE
E3-4Mobile usableDONE (responsive)
E3-5Focus rings sistemáticosOUT → NEXT
E3-6i18n badges ESOUT → NEXT

E4 — Plataforma

IDItemEstado
E4-1Rate limit loginOUT
E4-2Refresh tokensOUT
E4-3e2e CIOUT
E4-4Deploy prodOUT
E4-5Analytics SDKOUT
E4-6Integración distribuidoraOUT L4

3. Matriz MoSCoW del día (histórico)

PrioridadItems
MustLogin, list, stats, create, detail, patch, seed, docs, Paper
ShouldEmpty, error, hero real, dual CTA
CouldDRAFT workflow, filtros, charts
Won’t (día)IoT, marketplace, multi-tenant, pagos

4. Bugs conocidos (ninguno bloqueante)

IDDescripciónSeveridadAcción
Soft auth sin interceptor globalBajaNEXT L2+
Posible double-submit createBajadebounce NEXT

5. Ideas aparcadas (no contaminan L2)

  1. Comparador de tarifas con CTA a comercializadora (otro producto).
  2. Gamificación de ahorro (riesgo fitness-copy).
  3. Comunidad de vecinos por escalera (social L3).
  4. Predicción ML de factura (L4 + datos).

6. Criterio de “DONE del día”

CheckOK
Must implementados
Roadmap no disfraza deuda L2
Hipótesis etiquetadas
Demo 2 roles

7. Transferencia a día N+1

Solo vía memory.md §8 (diversidad), no como features pendientes de RELE L2.

20-implementation.md

Abrir documento

20 — Implementación — RELE

1. Resumen ejecutivo técnico

CampoValor
App path/Users/cristian/orca/rele-app/
GitHubhttps://github.com/Criscode2022/rele-app
APINestJS · puerto 3009 · prefijo /api
WebAngular standalone · puerto 4200
DBNeon PostgreSQL · Prisma · sparkling-snow-59844541
AuthJWT Bearer · roles RESIDENT | ADVISOR
DominioUser, Home, Reading
Fecha2026-08-09
Case/Users/cristian/orca/ux-projects/2026-08-09-rele/

2. Cómo arrancar

cd /Users/cristian/orca/rele-app

# Dependencias (apps independientes, sin workspaces)
npm install --prefix apps/api
npm install --prefix apps/web

# Entorno API: DATABASE_URL (Neon) + JWT_SECRET
# cp apps/api/.env.example apps/api/.env   # si existe

npm --prefix apps/api run prisma:migrate
npm --prefix apps/api run prisma:seed

npm run api    # Nest → http://localhost:3009
npm run web    # Angular → http://localhost:4200

Credenciales

RolNombreEmailPassword
RESIDENTElena Maríncasa@rele.energypassword123
ADVISORToni Gilasesor@rele.energypassword123

3. Módulos API implementados

Auth

  • POST /api/auth/login
  • Valida email/password; compara bcrypt; emite JWT.
  • Response: { accessToken, user: { id, email, name, role } }.
  • JwtStrategy + JwtAuthGuard protegen readings.

Readings

MétodoRutaNotas
GET/api/readingsfiltro por rol (resident propias / advisor todas)
GET/api/readings/stats/summarytotal, open, byStatus, kwhTotal
GET/api/readings/:idownership check resident
POST/api/readingssolo RESIDENT; home resolve/create; status SUBMITTED
PATCH/api/readings/:id/statussolo ADVISOR; advisorId + advisorNote

Prisma

Enums Role, ReadingStatus; modelos User, Home, Reading; seed 2 users + 1 home + 5 readings.

4. Frontend implementado

PáginaPathResponsabilidad
HomePage/marketing, hero, pasos, CTAs rol
LoginPage/loginform → ApiService.login → /lecturas
ReadingsPage/lecturasstats + list + empty/error + logout
ReadingNewPage/lecturas/nuevaform create (resident)
ReadingDetailPage/lecturas/:idget + patch status (advisor)

ApiService centraliza base URL http://localhost:3009/api, storage rele_token / rele_user, métodos HTTP tipados.

5. Decisiones de implementación

DecisiónRazón
Puerto API 3009Evitar colisión con VOLTA 3008 / SURCO 3007
Soft auth en páginasSimple L2; API es autoridad
Create → SUBMITTEDMenos fricción que DRAFT
Home implícita en createMenos pantallas CRUD L2
open = SUBMITTED + FLAGGEDOps de “requiere atención”
kwhTotal en statsDominio energía visible
Templates inline standaloneVelocidad daily
accessToken camelCaseAlineado serie (SURCO)

6. Variables de entorno

VariableServicioDescripción
DATABASE_URLAPINeon connection string
JWT_SECRETAPIFirma tokens
PORTAPIopcional, 3009

Web: URL de API en apps/web/src/app/core/api.service.ts.

7. Smoke de implementación (mínimo)

  1. Seed OK en consola (RELE seed OK).
  2. Login residente 200 + accessToken.
  3. List length ≥ 1; stats con kwhTotal.
  4. Create reading 200/201 · code RE-… · SUBMITTED.
  5. Login asesor ve lecturas de Elena.
  6. Patch REVIEWED/FLAGGED 200.
  7. RESIDENT patch → 403; ADVISOR create → 403.
  8. Web muestra palette maritime + badges.

8. Estructura de ficheros clave

rele-app/
├── package.json
├── README.md
└── apps/
    ├── api/
    │   ├── prisma/schema.prisma
    │   ├── prisma/seed.ts
    │   └── src/
    │       ├── main.ts                 # port 3009, prefix api
    │       ├── app.module.ts
    │       ├── auth/
    │       │   ├── auth.controller.ts
    │       │   ├── auth.service.ts
    │       │   ├── jwt.strategy.ts
    │       │   └── jwt-auth.guard.ts
    │       ├── readings/
    │       │   ├── readings.controller.ts
    │       │   ├── readings.service.ts
    │       │   └── readings.module.ts
    │       └── prisma/
    └── web/
        ├── tailwind.config.js          # fog/navy/sea/coral · Sora/Nunito
        ├── src/styles.css
        └── src/app/
            ├── app.routes.ts
            ├── core/api.service.ts
            └── pages/
                ├── home/home.page.ts
                ├── login/login.page.ts
                ├── readings/readings.page.ts
                ├── reading-new/reading-new.page.ts
                └── reading-detail/reading-detail.page.ts

9. Tokens implementados (web)

TokenValor
bg#EEF1F4
ink#0C2340
sea#2F8F8C
coral#E07A5F
border#D0D8E0
displaySora
sansNunito Sans

10. Seed detallado

CódigoPeriodokWhStatusNota asesor
RE-0809-012026-0721248.6REVIEWEDPico coherente con ola de calor.
RE-0809-022026-0616839.2REVIEWEDDentro de rango.
RE-0809-032026-0824556.1SUBMITTED
RE-0809-042026-0514133.4FLAGGEDRevisar tarifa PVPC vs fija.
RE-0809-052026-0415536.0SUBMITTED

Home: Piso Ruzafa · C/ Sueca 18, 3º · València · CUPS ES0021000000000001AB.

11. Endpoints — tabla de contratos

MétodoRutaAuthBody / notes
POST/api/auth/loginNo{ email, password }
GET/api/readingsJWT
GET/api/readings/stats/summaryJWT
GET/api/readings/:idJWT
POST/api/readingsJWT RESIDENT{ period, kwh, costEur?, notes?, homeLabel? }
PATCH/api/readings/:id/statusJWT ADVISOR{ status, advisorNote? }

12. Paridad con Paper y case

ArtefactoRef
Paper01KZJNCCMJ1FDHHPZZ923RWDWY
Heroassets/hero.jpg (case + web)
Docs2026-08-09-rele/docs/*
Executivepresentation/executive-summary.md

13. Criterio de cierre implementación

  • API runnable :3009
  • Web runnable :4200
  • Neon + seed
  • Multi-rol authz
  • Vertical slice lecturas
  • Tokens no genéricos
  • GitHub Criscode2022/rele-app