Investigación y documentación

Documentación · SURCO

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

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

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

1. LOAD — restricciones del día

EjeDecisiónMotivo (diversidad)
ComplejidadNivel 2Tras CORREA (L3 marketplace) no se repite L3 consecutivo. L2 = dominio acotado, multi-rol JWT, CRUD de entidad core + estados.
SectorAgricultura / explotación familiarNo usado en la serie (COMAL cocina, ATRIO museo, MERIDIANA clínica, SENDA mayores, FIRME legal, TROCHA logística, CORREA mascotas).
Tipo de productoCuaderno digital de parcelas + tareasTool ops de campo, no marketplace, no SaaS legal, no flota GPS.
AuthJWT multi-rol FARMER + TECHNICIANDirectiva D-P1-05; panel no abierto.
Craft mínimo≥ CORREA densificadoRúbrica no baja; L2 ≠ menos detalle visual ni docs thin.
Cierre§1.1 completo en una iteraciónDocs + Paper + app + Neon + smoke; sin “próximos pasos de producto del día”.
Puerto API3007Evitar colisión con CORREA (3006) y anteriores.
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 bone × leaf × straw; Literata + Manrope
AP-no-authPanel sin loginJWT obligatorio en /api/tasks*
AP-marketplace-copyLógica de marketplace en tool opsNo catálogo, no ratings, no checkout
AP-gps-fleetFlota/ruta tipo TROCHAParcelas y tareas de campo, sin GPS ni paradas de reparto
AP-fake-researchEstadísticas inventadas como primariasSolo hipótesis y supuestos etiquetados
AP-open-debtBacklog de features del L2 del díaVertical slice cerrado: listar, crear, detalle, 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 (no default Tailwind genérico).
  • API Nest + Prisma + Neon con seed demo usable.
  • Smoke: login + list + create (FARMER) + patch status; ng build o serve OK.
  • Docs en español, profundidad tipo portfolio (no stubs).

2. BRIEF — concepto del día

CampoValor
NombreSURCO
Eslogan”El campo, al día.”
Una fraseCuaderno digital de parcelas y tareas de campo para explotaciones familiares, con roles agricultor y técnico.
TipoTool ops L2 — cuaderno multi-rol (no marketplace, no fleet)
RolesFARMER (Inés Roura) · TECHNICIAN (Pol Vidal)
DominioParcel + FieldTask (PENDING | ACTIVE | DONE | CANCELLED) + User
EstiloBone #F4F0E6 × Leaf #3D5C3A / #1B3A2A / #2A4A32 × Straw #C4A35A
TipoLiterata (display) + Manrope (UI)
StackAngular + NestJS + Prisma + Neon + Tailwind + JWT
Paperhttps://app.paper.design/file/01KZDGF3509TA4WDZTTQJW1V45
Neonold-paper-48739086 · API :3007 · Web :4200
App/Users/cristian/orca/surco-app/

Por qué L2 agro (y no otra cosa)

  1. Diversidad de sector: la serie no había tocado agricultura; cierra un hueco frente a legal, logística y marketplace.
  2. Complejidad L2 justa: dos roles con vistas filtradas, máquina de estados de tarea, creación con parcela implícita y asignación opcional de técnico — suficiente para vertical slice sin multi-tenant ni pagos.
  3. Diferenciación vs TROCHA: TROCHA es flota última milla + paradas GPS/ruta; SURCO es cuaderno de explotación (bancales, cultivos, riego/poda/muestreo).
  4. Diferenciación vs CORREA: CORREA es marketplace B2C con mascotas y reservas; SURCO es tool interno de finca, sin catálogo ni matching.
  5. Metáfora de marca: surco = línea de labranza; el producto “traza” el día de campo en digital sin romanticismo rural kitsch.

Must-have del día (alcance L2)

#EntregaCriterio done
1Home marketingHero real, 3 pasos, CTAs rol, footer demo
2Login JWTFARMER y TECHNICIAN; redirect a tareas
3Lista tareas + statsFiltro por rol; chips de estado; empty
4Detalle + cambio de estadoPATCH status; permisos por rol
5Nueva tarea (solo FARMER)Parcela por nombre, dueAt, técnico opcional
6Empty / errorSin tareas; 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)

  • GPS de parcelas / mapas SIG
  • Cuaderno oficial de explotación (compliance legal agro UE)
  • Inventario de fitosanitarios / trazabilidad normativa
  • Multi-explotación / multi-tenant
  • Notificaciones push / WhatsApp
  • App nativa offline-first completa
  • Pagos, marketplace de insumos, clima API

3. Directivas activas aplicadas

IDAplicación en SURCO
D-P0-01L2 no reduce craft ni profundidad de docs
D-P0-02Hi-fi con media real (assets/hero.jpg), microcopy agro
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 leaf/straw/bone en Angular
D-P1-03apps/api + apps/web independientes
D-P1-05JWT en todas las rutas de tareas
D-P1-06Smoke login + GET/POST/PATCH tasks

4. Cuentas demo

RolNombreEmailPassword
FARMERInés Rouracampo@surco.agropassword123
TECHNICIANPol Vidaltecnico@surco.agropassword123

Seed de referencia: parcelas Bancal Nord (olivo arbequina 2,4 ha) y Surco Baix (almendro 1,1 ha); 5 FieldTask con códigos SU-MMDD-XX.

Supuestos (no investigación primaria)

  • Explotaciones familiares mediterráneas coordinan con libreta/WhatsApp.
  • Técnico externo de asesoramiento visita varias fincas.
  • Conectividad intermitente en campo (offline full = out of scope v1).

5. Criterio de cierre del día

  • Brief de diversidad y anti-patrones documentado
  • Producto definido (no marketplace, no GPS fleet)
  • Implementación runnable API :3007 / 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 — SURCO

CampoValor
File ID01KZDGF3509TA4WDZTTQJW1V45
URLhttps://app.paper.design/file/01KZDGF3509TA4WDZTTQJW1V45
NombreSURCO — Daily UX 2026-08-07
ProductoCuaderno digital parcelas + tareas multi-rol (L2)
Artboards~22 (+ labels de banda)
Bandas§1 UX · §2 Design + Public · §3 App · §4 Mobile · §5 States
Idioma UIes-ES
Mediaassets/hero.jpg (parcelas al atardecer)

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 desktop/tabletTasks list, Task detail, New task
4MOBILEOperación en cabina / móvil de campoTasks mobile
5STATESResiliencia UIEmpty, Error

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


2. Inventario de artboards

§1 — UX PROCESS

LabelNombreContenido
1-0§1 UX PROCESSEtiqueta de banda
2-0UX-00 CoverPortada SURCO, eslogan, fecha 2026-08-07, L2 agro, roles, dark leaf
3-0UX-01 StakeholdersMapa interés/influencia: agricultora, técnico, familia, asesoría, normativa
4-0UX-02 PersonasInés Roura (FARMER) · Pol Vidal (TECHNICIAN) — goals, pains, quote
5-0UX-03 JTBDJob principal + funcional/emocional/social + MoSCoW / stories Must
6-0UX-04 Journey5 fases farmer: planifica → asigna → Pol ejecuta → cierra DONE
7-0UX-05 BlueprintFrontstage app · backstage finca · sistemas · fallos red/estado
8-0UX-06 IASitemap público/auth/roles; navegación y permisos
9-0UX-07 DatosERD: User, Parcel, FieldTask + enums Role, TaskStatus

§2 — DESIGN + PUBLIC

LabelNombreContenido
A-0§2 DESIGN + PUBLICEtiqueta de banda
B-000 Design SystemColor bone/leaf/straw, tipo Literata+Manrope, botones, badges estado, cards
C-001 HomeNav, hero + media, cómo funciona (3 pasos), CTAs rol, footer demo
D-002 LoginSplit dark/form; email/password; contexto cuaderno de campo

§3 — APP (desktop)

LabelNombreContenido
E-0§3 APPEtiqueta de banda
F-003 Tasks FarmerLista + stats summary; badge rol; CTA + Tarea
G-004 Task DetailCódigo SU-…, parcela, notas, chips estado, acciones de transición
H-005 New TaskForm: título, parcela, cultivo, dueAt, notas, email técnico opcional

§4 — MOBILE

LabelNombreContenido
I-0§4 MOBILEEtiqueta de banda
J-006 Mobile TasksVista ~390px técnico en campo; touch targets ≥44px

§5 — STATES

LabelNombreContenido
K-0§5 STATESEtiqueta de banda
L-007 EmptySin tareas; CTA crear (solo FARMER)
M-008 ErrorFallo de carga / red; mensaje accionable + 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 SU-…Empty realista
Media / iconografíaCoverHeroBadgesAlertas

4. Mapeo Paper → Angular

ArtboardRuta appComponente
C-0 Home/HomePage
D-0 Login/loginLoginPage
F-0 Tasks/app/tasksTasksPage
G-0 Detail/app/tasks/:idTaskDetailPage
H-0 New/app/tasks/newTaskNewPage
J-0 Mobilemismas rutas, viewport estrechoresponsive
L-0 Empty/app/tasks (0 items)empty state en lista
M-0 Errorlista / detallemensajes error en páginas

5. Tokens de diseño en Paper

TokenValorUso
Bone / bg#F4F0E6Fondo de página
Leaf#3D5C3APrimary, CTAs, marca
Leaf deep#1B3A2AInk de acento / footer / covers dark
Leaf mid#2A4A32Hover / strong
Soft leaf#E8EFE4Fondos suaves / badges
Straw#C4A35AEyebrows, acentos de cultivo
Border#D9D2C4Bordes de card y inputs
DisplayLiterataH1–H2, logo wordmark
UIManropeBody, labels, botones

Nota implementación: tailwind.config.js de la app usa valores muy cercanos (#F3F0E8, #3A5A40, #C4A574) para legibilidad en pantalla; la fuente de verdad de marca del caso es la tabla superior.


6. Enlaces

01-project-definition.md

Abrir documento

01 — Definición de proyecto — SURCO

1. Identidad

CampoValor
NombreSURCO
SignificadoSurco de labranza: la línea que ordena el campo; metáfora de orden digital del día agrícola
Eslogan”El campo, al día.”
Una fraseCuaderno digital de parcelas y tareas para explotaciones familiares, con agricultor y técnico de campo.
SectorAgricultura / explotación familiar
TipoTool ops multi-rol (cuaderno de campo) — Nivel 2
PlataformaWeb responsive (desktop planificación + móvil de campo)
Mercado demoEspaña (finca familiar mediterránea: olivo, almendro)
Idiomaes-ES
Fecha caso2026-08-07

2. Problema

Principal (hipótesis de diseño)

Las explotaciones familiares coordinan riego, poda, muestreos y revisiones de plagas con libretas, notas en el móvil y hilos de WhatsApp. No hay un estado compartido de la tarea ni un historial por parcela que agricultor y técnico vean a la vez.

Secundarios

ProblemaQuién lo sufreEfecto
Tareas “en la cabeza” del dueñoFARMEROlvidos, re-trabajo, visitas innecesarias
Técnico sin lista clara del díaTECHNICIANLlamadas para preguntar “¿qué hago en el bancal X?”
Sin código ni fecha de vencimientoAmbosDifícil priorizar con varios bancales
Papel mojado / ilegible en cabinaAmbosPérdida de notas de campo

Supuestos (no investigación primaria propia)

  • S1: En fincas familiares pequeñas–medianas (1–5 parcelas activas), la coordinación se hace sin software de gestión agrícola enterprise.
  • S2: El técnico de campo (asesor o empleado) necesita una lista corta de asignaciones, no un ERP.
  • S3: El valor inmediato está en estado de tarea + parcela + due date, no en SIG ni compliance legal del cuaderno oficial.

Hipótesis de producto

IDHipótesisSeñal de validación (futura)
H1Un listado compartido con estados reduce llamadas de “¿ya regaste?”↓ mensajes de estado / semana
H2Asignar técnico en la creación acelera el paso a ACTIVE% tareas con technicianId en <24 h
H3Códigos cortos SU-MMDD-XX facilitan referencia oral en campoUso del código en notas/llamadas

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

3. Propuesta de valor

ParaValor
Agricultora (Inés)Planifica el día de parcela, crea tareas, ve abiertas vs hechas, asigna técnico.
Técnico (Pol)Entra y ve solo sus asignaciones; actualiza ACTIVE → DONE desde el móvil.
ExplotaciónUn cuaderno digital mínimo viable sin ERP ni GPS de flotas.

No es SURCO

ExcluidoPor qué
Marketplace de insumos o serviciosEso sería CORREA-like; no es tool de finca
Consola GPS / última millaEso es TROCHA
SaaS legal / expedientesEso es FIRME
Cuaderno oficial de explotación (compliance)Alcance regulatorio > L2
Multi-tenant SaaS agro enterpriseComplejidad L3/L4

4. Objetivos

Negocio / caso de estudio

  • Demostrar vertical slice L2 agro con JWT multi-rol y dominio Parcel/FieldTask.
  • Portfolio coherente: Paper + docs + app runnable.

Usuario

RolObjetivo medible en demo
FARMERCrear tarea en < 2 min; ver summary de abiertas
TECHNICIANMarcar DONE en < 3 taps desde la lista

No objetivos v1 (explícitos)

  • Mapas y geocercas
  • Inventario de productos fitosanitarios
  • Facturación o costes por tarea
  • Chat in-app
  • Roles ADMIN / multi-finca

5. Roles y permisos (resumen)

AcciónFARMERTECHNICIAN
Login JWT
Listar tareas propiasSí (como farmer)Sí (asignadas)
Ver stats summary
Crear tareaNo (403)
Ver detalle si es parteSí si technicianId
Cambiar statusSí (todas las transiciones de su tarea)ACTIVE / DONE / CANCELLED (no fuerza PENDING arbitrario según reglas API)

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

TipoMétricaDefinición
North StarTareas DONE / semanaCierre real de trabajo de campo
Activación1ª tarea creada por FARMERPost-login create
Engagement% tareas con técnico asignadoACTIVE con technicianId
OperativaTiempo PENDING → DONEMediana por parcela
CalidadTasa error API en list/create4xx/5xx

7. Alcance funcional v1 (L2)

MóduloIncluido
Home públicaHero, 3 pasos, CTAs
AuthPOST /api/auth/login → JWT
TareasGET list, GET by id, POST create, PATCH status, GET stats
ParcelasCreadas implícitamente por nombre en create
UI estadosLoading implícito, empty, error de red
Seed2 usuarios, 2 parcelas, 5 tareas

8. Criterios de aceptación de producto

  1. Un FARMER puede iniciar sesión y ver solo sus tareas ordenadas por dueAt.
  2. Un TECHNICIAN ve solo tareas donde technicianId = su id.
  3. Crear tarea exige título, nombre de parcela y fecha; opcional técnico por email → status ACTIVE.
  4. El detalle muestra código, parcela, cultivo, ha, notas y permite cambiar estado.
  5. Sin token, las rutas /api/tasks* responden 401.
  6. La home comunica “cuaderno”, no marketplace ni flota.

9. Stack y artefactos

CapaDetalle
FrontendAngular + Tailwind · puerto 4200
BackendNestJS · puerto 3007
DBNeon PostgreSQL · Prisma · project old-paper-48739086
AuthJWT (passport/strategy en API)
DiseñoPaper 01KZDGF3509TA4WDZTTQJW1V45
Repo app/Users/cristian/orca/surco-app/

10. Riesgos y mitigaciones

RiesgoImpactoMitigación v1
Confundir con ERP agroExpectativa infladaCopy “cuaderno”, alcance L2 en docs
Offline real de campoTécnico sin redDocumentado fuera de alcance; UI de error clara
Confusión de roles403 inesperadoBadge de rol en header; solo FARMER ve “+ Tarea”
Parcela duplicada por typoDatos suciosfindFirst por nombre; mejora futura: selector

11. Glosario

TérminoDefinición en SURCO
Parcela / bancalUnidad de tierra con nombre, cultivo y hectáreas
Tarea de campoTrabajo planificado (riego, poda, muestreo…) con estado y vencimiento
CuadernoVista principal de tareas + stats del usuario
Código SU-Identificador corto oral (SU-0807-01)

02-ux-research-strategy.md

Abrir documento

02 — Estrategia de investigación UX — SURCO

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 de finca familiarModelado 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 digitalización agro (cuadernos de campo, asesoramiento técnico).
  • Analogía operativa con herramientas de tareas multi-rol ya validadas en la serie (FIRME casos, TROCHA paradas, SENDA visitas) — no copiar dominio.
  • Restricciones ALS-2 de diversidad (sector agro libre; no marketplace; no GPS fleet).

Límites éticos de verdad

ProhibidoPermitido
“El 73% de agricultores usa WhatsApp para riego” sin fuente[SUPUESTO] la coordinación informal es frecuente en fincas pequeñas”
Citas de usuarios ficticios como entrevistas realesQuotes de persona etiquetadas como constructo de diseño
NPS inventadoHipótesis H1–H3 con métrica futura

3. Stakeholders

StakeholderInfluenciaInterésNecesidad principal
Agricultora titular (FARMER)AltaMuy altaPlanificar y ver estado de bancales
Técnico de campo (TECHNICIAN)Media–AltaAltaLista del día y cierre rápido
Familia / mano de obra ocasionalBaja formalMediaInstrucciones claras (fuera de app v1)
Asesoría agronómica externaMediaMediaTrazabilidad ligera de intervenciones
Normativa / cuaderno oficialAlta potencialBaja en v1Fuera de alcance L2 (no simular compliance)
Proveedor de insumosBajaBajaNo es marketplace

Mapa de poder (resumen)

  • Decisor de adopción: FARMER (titular de la explotación).
  • Usuario frecuente en campo: TECHNICIAN (y a veces el propio farmer).
  • Riesgo de rechazo: si la app pide más datos que un WhatsApp sin devolver claridad de estado.

4. Personas

P1 — Inés Roura · FARMER

CampoDetalle
Edad / contexto~42 años; explotación familiar olivo + almendro
DigitalMedia–alta (móvil y banca online); poco tiempo de escritorio al mediodía
GoalsTener el día de parcelas “al día”; no depender solo de la memoria
PainsNotas sueltas; no saber si Pol cerró el riego; papel en la cabina
Quote de diseño“Si no está escrito en el cuaderno, no está hecho.”
Email democampo@surco.agro

Escenario: Por la mañana crea “Riego gota a gota” en Bancal Nord, asigna a Pol, y por la tarde comprueba DONE.

P2 — Pol Vidal · TECHNICIAN

CampoDetalle
Edad / contexto~31 años; técnico de campo que apoya varias fincas (en demo: la de Inés)
DigitalAlta; prefiere móvil con una mano
GoalsVer asignaciones, ejecutar, marcar hecha sin llamadas de ida y vuelta
PainsListas en WhatsApp sin estado; no sabe prioridad entre parcelas
Quote de diseño“Dime el bancal, la tarea y cuándo vence. Ya marco yo.”
Email demotecnico@surco.agro

Escenario: Abre SURCO en el móvil, ve ACTIVE, ejecuta, pasa a DONE.

Anti-persona

QuiénPor qué no es target v1
Director de cooperativa multi-finca con ERPNecesita multi-tenant, reporting y compliance → L3/L4
Operador de flota de cosechadoras con GPSProducto tipo TROCHA, no cuaderno

5. JTBD y user stories

Job principal

Cuando hay trabajos de parcela que deben hacerse esta semana,
quiero registrarlos con parcela, fecha y responsable,
para que el campo quede al día sin perseguirse por WhatsApp.

Jobs secundarios

JobRol
Ver cuántas tareas abiertas tengoAmbos
Cerrar una intervención hecha en campoTECHNICIAN / FARMER
Referir una tarea por código corto en llamadaAmbos

Stories Must (v1)

IDStoryAC resumido
E1Como usuario, inicio sesión con email/password y recibo JWT200 + token; 401 si mal
E2Como FARMER, listo mis tareas y un summary por estadoGET list + stats
E3Como TECHNICIAN, listo solo mis asignacionesFiltro technicianId
E4Como FARMER, creo tarea con parcela y vencimientoPOST; parcela upsert por nombre
E5Como FARMER, puedo asignar técnico por emailstatus ACTIVE si existe
E6Como participante, cambio estado de la tareaPATCH status + permisos
E7Como visitante, entiendo el valor en la homeCTAs “Soy agricultor / Soy técnico”

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

  • Selector de parcela existente (vs texto libre).
  • Filtros por estado en UI.
  • Adjuntos foto de plaga.
  • Offline queue.

6. Journey — día de Inés (happy path)

FaseAcciónTouchpointEmoción
DescubrirEntra a home SURCOWeb públicaCuriosidad
EntrarLogin FARMER/loginConfianza (demo clara)
PlanificarRevisa stats y lista/app/tasksControl
CrearNueva tarea riego/app/tasks/newAlivio
DelegarAsigna tecnico@…Create con emailCoordinación
EsperarPol trabaja en campoFuera de appNeutro
CerrarVe DONE en lista/detalleAppSatisfacción “al día”

Journey — Pol (campo)

Login → Mis asignaciones → Detalle → ACTIVE (si aplica) → DONE → siguiente tarea.

7. Service blueprint (simplificado)

CapaElementos
EvidenciaHome, login, lista, detalle, códigos SU-
FrontstageAcciones de usuario en Angular
BackstageNestJS + Prisma + Neon; seed de parcelas
SoporteCredenciales demo en footer; mensajes error red
Fallos401 token; 403 create tech; 404 técnico email; red caída → UI error

8. Hallazgos → requisitos → features

Hallazgo (etiquetado)RequisitoFeature v1
[SUPUESTO] Coordinación informal pierde estadoEstado explícito de tareaEnum PENDING/ACTIVE/DONE/CANCELLED
[HIPÓTESIS H1] Lista compartida reduce fricciónVistas por rolFiltro farmerId / technicianId
[DECISIÓN] Técnico opera en móvilTouch-friendly list/detailCards grandes, CTAs claros
[DECISIÓN] No ERPMínimo de campostitle, parcel, dueAt, notes, tech opcional
[SUPUESTO] Referencia oral en fincaCódigo cortoSU-MMDD-XXX
[DECISIÓN] No compliance legalNo módulos ROPO/cuaderno oficialFuera de alcance documentado

9. Preguntas abiertas (investigación futura real)

  1. ¿Cuántas tareas activas gestiona una finca familiar en semana de riego?
  2. ¿El técnico es empleado fijo o asesor multi-finca? (impacta multi-tenant)
  3. ¿Qué % del tiempo de campo hay cobertura de datos? (offline)
  4. ¿Necesitan export PDF para subvenciones? (compliance)

Estas preguntas no bloquean el L2; informan un posible L3.

10. Plan de validación post-caso (opcional)

MétodoMuestraÉxito
Guerrilla test 5 agricultores/técnicos5Completar create + done sin ayuda
Analytics (si se instrumenta)Demoactivation + north star
Entrevista contextual en finca3Confirmar S1–S3 o refutar

Estado actual: validación de diseño + smoke técnico del vertical slice; no estudio de campo primario.

03-information-architecture.md

Abrir documento

03 — Arquitectura de información — SURCO

1. Principios de IA

PrincipioAplicación
Cuaderno primeroTras login, destino único: lista de tareas (no dashboard multi-widget)
Rol visibleBadge FARMER / TECHNICIAN en header de app
Pocos nivelesPúblico (2) + App (3 rutas) — profundidad máxima 2 clicks a detalle
Permisos en navegaciónCTA “+ Tarea” solo FARMER; rutas API con guard
Lenguaje de dominioParcela, tarea, vencimiento — no “ticket”, “issue”, “order”

2. Sitemap

/                          Home (público)
/login                     Login JWT
/app/tasks                 Lista + stats (auth)
/app/tasks/new             Nueva tarea (auth · FARMER)
/app/tasks/:id             Detalle + estado (auth · parte)
/**                        → redirect /

Árbol por audiencia

AudienciaNodos relevantes
VisitanteHome → Login
FARMERLogin → Tasks → New / Detail
TECHNICIANLogin → Tasks → Detail (status)

3. Navegación

Pública

ElementoDestinoNotas
Wordmark SURCO/Display Literata
Entrar/loginTexto
Abrir cuaderno/loginPrimary CTA
Soy agricultor / Soy técnico/loginMismo form; rol viene del usuario seed

App (autenticada)

ElementoDestinoVisibilidad
Wordmark/app/tasksAmbos
Badge rolAmbos
Nombre usuarioAmbos
+ Tarea/app/tasks/newSolo FARMER
Salirlimpia token → /loginAmbos
Card tarea/app/tasks/:idAmbos
Volver (detalle)/app/tasksAmbos

No hay menú lateral multi-sección en v1 (evita IA de ERP).

4. Inventario de contenido

PantallaContenidos
HomeEyebrow sector, H1 eslogan, lead, CTAs, 3 stats teaser, hero img, 3 pasos, footer demo
LoginTítulo, email, password, submit, error, enlace implícito a demo
TasksTítulo contextual por rol, 4 stats, lista cards, empty, error
NewForm campos, submit, cancel/back
DetailMeta código/parcela, notas, selector/acciones de estado

5. Taxonomía y etiquetas de estado

Status APILabel UISemántica
PENDINGPendienteCreada; sin técnico o aún no activa
ACTIVEActivaEn curso / asignada
DONEHechaCerrada con éxito
CANCELLEDCanceladaNo se hará

Orden de lista: por dueAt ascendente (lo que vence antes, primero).

6. Modelo mental vs UI

Modelo mental del usuarioRepresentación
“Mi libreta de hoy”/app/tasks + stats abiertas
“El bancal del norte”parcel.name + crop + ha en card
“Se lo dije a Pol”technician name en card (vista farmer)
“Ya está regado”status DONE

7. Permisos y objetos

User 1──* Parcel (farmerId)
User 1──* FieldTask (farmerId)
User 0..1──* FieldTask (technicianId opcional)
Parcel 1──* FieldTask
ObjetoQuién creaQuién veQuién muta status
ParcelFARMER (implícito en create task)Vía tareaNo hay CRUD UI aparte
FieldTaskFARMERFarmer dueño o tech asignadoParticipante según reglas API

8. Flujos de información entre roles

  1. FARMER crea tarea (+ opcional email técnico) → si hay técnico válido, ACTIVE.
  2. TECHNICIAN lista solo asignadas → actualiza a DONE.
  3. FARMER ve el cambio en list/detail (mismo recurso).

No hay bandeja de notificaciones: el “pull” es abrir el cuaderno.

9. SEO / URLs (público)

URLindexableMotivo
/Sí (demo)Marketing del caso
/loginNoindex preferibleAuth
/app/*NoPrivado

10. Criterios de aceptación IA

  1. Desde home, un usuario llega a login en 1 click.
  2. Tras login válido, aterriza en lista de tareas.
  3. Ninguna ruta de app asume rol incorrecto en la nav (sin “+ Tarea” para técnico).
  4. Detalle y new son hijos semánticos de tasks (path prefix /app/tasks).
  5. No existen secciones huérfanas (inventario, mapa, chat) en la nav.

04 — Flujos de usuario — SURCO

Convenciones

  • Actor: FARMER | TECHNICIAN | Guest
  • Éxito: resultado observable
  • Errores: UI + código HTTP cuando aplica

F1 — Descubrimiento y entrada (Guest)

Home (/) → CTA "Abrir cuaderno" | "Entrar" | "Soy agricultor/técnico"
        → Login (/login)
PasoAcciónSistema
1Lee valor y pasos 01–03Render estático
2Click CTARouter → /login
3Opcional: lee credenciales demo en footerCopy

Éxito: formulario de login visible.
No hay registro público en v1 (solo seed).


F2 — Login JWT

/login → POST /api/auth/login { email, password }
      → 200 { accessToken, user } → localStorage → /app/tasks
      → 401 → mensaje error en form
CampoValidación cliente (mín.)API
emailrequired, email@IsEmail()
passwordrequired, min 6@MinLength(6)

Éxito: token guardado; user con role FARMER o TECHNICIAN.
Errores:

CasoComportamiento
Credenciales inválidas401 + mensaje “No se pudo entrar…”
Red caídaError de red en UI
Ya autenticado visita /loginPuede re-login; lista exige token

F3 — Listar tareas + stats

/app/tasks (guard token en cliente)
  → GET /api/tasks
  → GET /api/tasks/stats/summary
  → Render cards + 4 métricas
RolFiltro servidor
FARMERfarmerId = userId
TECHNICIANtechnicianId = userId

Orden: dueAt ASC.
Include: farmer, technician, parcel.

Variantes de UI

Estado datosUI
loading(implícito hasta next)
items.length = 0Empty L-0 + CTA crear si FARMER
error HTTPMensaje rojo M-0
OKLista + stats TOTAL / ABIERTAS / ACTIVAS / HECHAS

AC:

  1. Sin token → redirect /login.
  2. Técnico no ve botón “+ Tarea”.
  3. Stats open = PENDING + ACTIVE.

F4 — Crear tarea (solo FARMER)

/app/tasks → + Tarea → /app/tasks/new
  → submit → POST /api/tasks
  → 201/200 task → navegar a lista o detalle
  → 403 si TECHNICIAN

Campos

CampoObligatorioNotas
titlemin 3
parcelNamemin 2; upsert parcela del farmer
cropNodefault “Cultivo” si parcela nueva
dueAtISO date string
notesNodefault ""
technicianEmailNosi válido TECHNICIAN → status ACTIVE

Lógica de negocio

  1. Buscar parcela del farmer por name; si no existe, crear con hectares: 1 y crop dado.
  2. Si technicianEmail: buscar user role TECHNICIAN; si no, 404 “Técnico no encontrado”.
  3. Generar code = SU- + MMDD + - + random 100–999.
  4. Status inicial: PENDING sin técnico; ACTIVE con técnico.

Errores:

CasoHTTPUI
TECHNICIAN llama create403No debería llegar (sin nav)
Email técnico inexistente404Mensaje form
Validación400Mensaje campos
RedError genérico

AC: FARMER con datos válidos ve la nueva tarea en la lista ordenada por dueAt.


F5 — Detalle y cambio de estado

/app/tasks/:id
  → GET /api/tasks/:id
  → usuario elige nuevo status
  → PATCH /api/tasks/:id/status { status }
  → UI actualiza badge

Permisos get

RolCondiciónSi falla
FARMERtask.farmerId === userId403
TECHNICIANtask.technicianId === userId403
no existe404

Permisos patch (resumen API)

  • Debe ser parte (mismas reglas que get).
  • TECHNICIAN: status permitido en subconjunto ACTIVE | DONE | CANCELLED (no impone PENDING según guard de servicio).
  • FARMER: puede actualizar status de sus tareas (incluye cancelar).

Transiciones de diseño (happy)

PENDING ──► ACTIVE ──► DONE
    │           │
    └───────────┴──► CANCELLED

AC: tras DONE, la lista muestra badge “Hecha” y stats HECHAS incrementa al refrescar.


F6 — Logout

Click Salir → clear token/user → /login

AC: volver a /app/tasks redirige a login.


F7 — Flujos de error transversales

IDEscenarioRespuesta
E-401Token ausente/expirado en API401; cliente → login
E-403Técnico crea tarea / ve tarea ajena403; mensaje o redirect
E-404id inexistente o técnico email404
E-netAPI caídaCopy de error; reintento manual (reload)
E-empty0 tareasEmpty state amable

Diagrama resumen ( Mermaid )

flowchart TD
  H[Home] --> L[Login]
  L -->|JWT OK| T[Tasks list]
  L -->|401| L
  T -->|FARMER| N[New task]
  N -->|POST| T
  T --> D[Detail]
  D -->|PATCH status| D
  T -->|logout| L

Matriz flujo × rol

FlujoGuestFARMERTECHNICIAN
F1 Home
F2 Login
F3 List
F4 Create
F5 Status✓ (asignadas)
F6 Logout

05 — Modelo de datos — SURCO

1. Visión general

Dominio mínimo de cuaderno de campo L2:

EntidadPropósito
UserIdentidad + rol FARMER | TECHNICIAN
ParcelBancal / parcela de la explotación del farmer
FieldTaskTarea de campo con estado, vencimiento y asignación opcional

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

2. Enums

Role

ValorDescripción
FARMERTitular / planificador; crea tareas y parcelas
TECHNICIANEjecutor de campo; ve asignaciones

TaskStatus

ValorDescripción
PENDINGPlanificada; sin arrancar o sin técnico
ACTIVEEn curso (p. ej. al asignar técnico)
DONECompletada
CANCELLEDAnulada

3. Diagrama ER (texto)

User ─────────────┬────────── Parcel
  id              │            id
  email           │            name
  passwordHash    │            crop
  name            │            hectares
  role            │            farmerId ──► User.id

                  ├────────── FieldTask (as farmer)
                  │            id, code, title, notes
                  │            status, dueAt
                  │            farmerId ──► User.id
                  │            technicianId? ──► User.id
                  │            parcelId ──► Parcel.id

                  └────────── FieldTask (as technician)

4. Tablas / modelos Prisma

User

CampoTipoConstraints
idStringPK, cuid
emailStringunique
passwordHashStringbcrypt
nameString
roleRole
createdAtDateTimedefault now
updatedAtDateTimeupdatedAt
parcelsParcel[]
tasksFarmerFieldTask[]rel “FarmerTasks”
tasksTechFieldTask[]rel “TechTasks”

Parcel

CampoTipoConstraints
idStringPK
nameStringnombre de bancal (no unique global; lookup por farmer+name)
cropStringcultivo
hectaresFloat
farmerIdStringFK User
tasksFieldTask[]
createdAtDateTime

FieldTask

CampoTipoConstraints
idStringPK
codeStringunique, formato SU-MMDD-XXX
titleString
notesStringdefault ""
statusTaskStatusdefault PENDING
dueAtDateTime
farmerIdStringFK
technicianIdString?FK opcional
parcelIdStringFK
createdAt / updatedAtDateTime

5. Reglas de integridad y negocio

ReglaImplementación
Solo FARMER crea tareasController: role check → 403
Lista filtrada por rolwhere farmerId o technicianId
Acceso a detalleMismas condiciones o 403
Parcela al vuelofindFirst name+farmer; else create
Técnico por emailUser.role debe ser TECHNICIAN
Código únicounique en DB; generación en service
PasswordNunca en claro; solo passwordHash

6. Seed de referencia (2026-08-07)

EntidadDatos
FARMERInés Roura · campo@surco.agro · password123
TECHNICIANPol Vidal · tecnico@surco.agro · password123
Parcel 1Bancal Nord · Olivo arbequina · 2.4 ha
Parcel 2Surco Baix · Almendro · 1.1 ha
Tasks5 filas: riego ACTIVE, plagas PENDING, poda DONE, suelo PENDING, abonado ACTIVE

Códigos ejemplo: SU-0807-01SU-0807-05 (el prefijo de fecha depende del día de seed).

7. Contratos API ↔ modelo

POST /api/auth/login

In: { email, password }
Out: { accessToken, user: { id, email, name, role } }

GET /api/tasks

Out: FieldTask[] con parcel, farmer, technician.

GET /api/tasks/stats/summary

Out:

{
  "total": 5,
  "open": 4,
  "byStatus": { "PENDING": 2, "ACTIVE": 2, "DONE": 1, "CANCELLED": 0 }
}

POST /api/tasks

In:

{
  "title": "Riego gota a gota",
  "parcelName": "Bancal Nord",
  "crop": "Olivo arbequina",
  "dueAt": "2026-08-08T08:00:00.000Z",
  "notes": "2 h sector A",
  "technicianEmail": "tecnico@surco.agro"
}

Out: FieldTask creado (status ACTIVE si técnico OK).

PATCH /api/tasks/:id/status

In: { "status": "DONE" }
Out: FieldTask actualizado.

GET /api/tasks/:id

Out: un FieldTask con relaciones; 403/404 según acceso.

8. Índices y escalado (notas)

Necesidad futuraÍndice sugerido
Listas por farmer + due(farmerId, dueAt)
Listas por tech + status(technicianId, status)
Búsqueda por codeya unique en code

v1 no define índices extra más allá de PK/unique Prisma.

9. Privacidad de datos (enlace a doc 11)

  • Email y nombre son datos de cuenta demo.
  • Notas de tarea pueden contener info operativa de finca: no loguear bodies en claro en producción.
  • No se almacenan coordenadas GPS ni datos de salud vegetal sensibles más allá de texto libre.

10. Criterios de aceptación de datos

  1. Migración init aplica User, Parcel, FieldTask + enums.
  2. Seed es idempotente en la práctica (deleteMany + create).
  3. No se puede insertar FieldTask sin parcelId y farmerId válidos (FK).
  4. code único impide colisiones exactas (retry no implementado; probabilidad baja con random 100–999).

06 — Stack tecnológico — SURCO

1. Resumen

CapaTecnologíaVersión / nota
FrontendAngular (standalone components)App en apps/web
EstilosTailwind CSSTokens en tailwind.config.js
BackendNestJSApp en apps/api
ORMPrismaschema + migrate + seed
DBNeon (PostgreSQL serverless)project old-paper-48739086
AuthJWT (Passport strategy + guard)Header Authorization: Bearer
Validación APIclass-validator + DTOsLogin, create, status
Passwordbcryptcost 10 en seed
DiseñoPaperfile 01KZDGF3509TA4WDZTTQJW1V45
FuentesGoogle Fonts Literata + Manropestyles.css

Stack fijo de la serie ALS-2: no se sustituye Angular/Nest/Neon/Tailwind sin excepción documentada.

2. Estructura monorepo app

surco-app/
├── package.json          # scripts api / web / db:*
├── apps/
│   ├── api/
│   │   ├── prisma/
│   │   │   ├── schema.prisma
│   │   │   ├── seed.ts
│   │   │   └── migrations/
│   │   ├── src/
│   │   │   ├── main.ts
│   │   │   ├── app.module.ts
│   │   │   ├── auth/
│   │   │   ├── tasks/
│   │   │   └── prisma/
│   │   └── package.json
│   └── web/
│       ├── src/app/
│       │   ├── pages/ (home, login, tasks, task-detail, task-new)
│       │   ├── core/api.service.ts
│       │   └── app.routes.ts
│       ├── tailwind.config.js
│       └── package.json
└── README.md

Decisión: apps independientes (npm --prefix), sin npm workspaces que rompan Angular (directiva D-P1-03).

3. Puertos y entornos

ServicioPuertoURL local
API Nest3007http://localhost:3007
Web Angular4200http://localhost:4200
Prefijo API/apip. ej. POST /api/auth/login

Variables típicas API (.env):

VarUso
DATABASE_URLNeon connection string
JWT_SECRETFirma de tokens
PORT3007 (si aplica)

4. Backend — módulos

MóduloResponsabilidad
AuthModulelogin, JWT emit, strategy, guard
TasksModuleCRUD parcial de FieldTask + stats
PrismaModulecliente Prisma global

Endpoints

MétodoPathAuthRol
POST/api/auth/loginNo
GET/api/tasksJWTFARMER / TECHNICIAN
GET/api/tasks/stats/summaryJWTFARMER / TECHNICIAN
GET/api/tasks/:idJWTparte de la tarea
POST/api/tasksJWTFARMER only
PATCH/api/tasks/:id/statusJWTparte + reglas status

CORS: habilitado para dev web en :4200 (según main.ts).

5. Frontend — arquitectura

PiezaDetalle
Routingapp.routes.ts — 5 rutas + wildcard
Estado authlocalStorage token + user en ApiService
HTTPHttpClient vía service
UITemplates inline en componentes standalone
GuardSoft-guard en ngOnInit (redirect si no token)

Rutas

PathPágina
''HomePage
loginLoginPage
app/tasksTasksPage
app/tasks/newTaskNewPage
app/tasks/:idTaskDetailPage

6. Diseño → código

Token marcaUso Tailwind app (aprox.)
Bonebg-bg #F3F0E8
Leafprimary #3A5A40
Strawstraw #C4A574
Borderborder #E0D9CC
Displayfont-display Literata
Sansfont-sans Manrope

7. Scripts npm (raíz app)

npm run api        # Nest start:dev :3007
npm run web        # ng serve :4200
npm run db:migrate # prisma migrate
npm run db:seed    # seed demo

Instalación:

npm install --prefix apps/api
npm install --prefix apps/web

8. Seguridad técnica (resumen; ver doc 11)

ControlImplementación
Passwordsbcrypt hash
SesiónJWT bearer
Autorizaciónguard + checks farmer/technician
ValidaciónDTOs class-validator
Secretos.env no commitear

9. Observabilidad

v1: logs Nest por defecto; sin APM. Errores de UI se muestran como copy al usuario. Analytics de producto: doc 12 (modelo).

10. Criterios de aceptación técnicos

  1. npm run api levanta en 3007 y responde login seed.
  2. npm run web sirve en 4200 y consume API.
  3. Prisma migrate + seed generan 2 users y 5 tasks.
  4. ng build (o serve) sin errores de compilación.
  5. Rutas de tasks sin JWT → 401.

07-creative-direction.md

Abrir documento

07 — Dirección creativa — SURCO

1. Posicionamiento visual

EjeElección
PersonalidadSobria, terrenal, ordenada — “cuaderno de finca”, no app infantil rural
PromesaClaridad del día de campo
Tono visualBone cálido + leaf profundo + paja (straw) como acento de cultivo
Tono verbalDirecto, sin anglicismos innecesarios, sin paternalismo al agricultor
Referencias a evitarClipart de tractores, stock ultra-saturado, SaaS morado genérico, industrial TROCHA, cream-sage CORREA

2. Concepto de marca

SURCO es la línea que el arado deja: orden en la tierra.
El producto traza el mismo orden en digital: parcelas, tareas, estados.

AtributoNo
MaterialidadPapel hueso, tinta verde hojaNeón, glassmorphism frío
RitmoRespiración generosa, cards redondeadasDensidad de terminal logístico
AutoridadTipografía display literaria (Literata)Display sci-fi / mono industrial
AcentoStraw en eyebrows y metaRojo alarma como color de marca

3. Moodboard verbal

  1. Mañana en el bancal, luz lateral, polvo fino.
  2. Libreta de campo con mancha de tierra en el borde — traducida a UI limpia.
  3. Verde olivo y hueso de almendra; metal de grifo de riego solo como detalle.
  4. Silencio operativo: pocos colores, muchas decisiones claras.

4. Fotografía y media

UsoCriterio
HeroParcelas reales / fotorrealistas al atardecer o luz natural
Alt textDescriptivo: “Parcelas agrícolas al atardecer”
Archivo caseassets/hero.jpg
Archivo appapps/web/.../assets/hero.jpg (misma pieza)
IconografíaMínima; preferir tipografía y badges de estado a icon sets genéricos

Anti-patrón: rectángulos grises con título (D-P0-02).

5. Sistema tipográfico (dirección)

RolFamiliaCarácter
Display / marca / H1–H2LiterataSerif humanista, editorial agrícola contemporánea
UI / body / labelsManropeSans geométrica legible en móvil de campo

Jerarquía orientativa:

EstiloTamaño aprox.Peso
H1 home40–48px600
H1 app28–32px600
Body16px400–500
Eyebrow11–12px700, tracking amplio, color straw
Caption12–13px500, ink-muted

6. Color — dirección de marca

NombreHexRol
Bone#F4F0E6Fondo página
Leaf#3D5C3APrimary, CTAs, wordmark acento
Leaf deep / ink brand#1B3A2AFooter, énfasis
Leaf mid#2A4A32Hover strong
Straw#C4A35AEyebrows, meta códigos
Border#D9D2C4Separadores y cards
Surface#FFFFFFCards sobre bone
Ink UI#1A1814 / deep leafTexto principal
Muted#6B655CSecundario
Dangerrojo semántico sistemaSolo errores, no marca

7. Forma y layout

ElementoSpec creativa
Radios16–20px cards; botones pill (rounded-full)
Grid home2 col hero en desktop; stack mobile
Max width~72rem (6xl) contenido
Header64–72px; borde sutil bone/border
SombraSuave en hero media; cards con borde primero
Densidad appLista vertical con espacio; stats en 2×2 / 4 col

8. Motion (mínimo)

v1 sin librería de motion. Transiciones nativas:

  • Hover borde card → primary/40
  • Botones hover primary-strong
  • Sin spinners custom obligatorios (loading textual aceptable)

9. Diferenciación en la serie diaria

ProyectoClimaSURCO se diferencia por
TROCHAAsfalto + ámbar señalAgro bone/leaf; no paradas flota
CORREACream sage terracotta petNo marketplace; serif Literata agrícola
FIRMEParchment forest legalMenos “despacho”, más “campo”
SENDACuidado socialNo indigo; dominio parcela/tarea

10. Criterios de aceptación creativos

  1. Home reconoce SURCO en <3 s (wordmark + eslogan + hero agro).
  2. No se confunde con app de delivery ni pet-care.
  3. CTAs “Soy agricultor / Soy técnico” alineados al modelo multi-rol.
  4. Estado de tareas legible por color+texto (no solo color).
  5. Consistencia Paper ↔ Angular en tokens y tipografía.

08-design-system.md

Abrir documento

08 — Design system — SURCO

1. Fundamentos

CapaValor
Nombre DSSURCO UI (L2 vertical slice)
PrincipioClaridad operativa + calidez de finca
PlataformasWeb responsive 360–1280+
ImplementaciónTailwind tokens + componentes de página (no lib publicada)

2. Color tokens

Marca (fuente de verdad del caso)

TokenHexUso
color.bg.bone#F4F0E6Background app/marketing
color.surface#FFFFFFCards, header app
color.leaf#3D5C3APrimary
color.leaf.strong#2A4A32Hover primary
color.leaf.deep#1B3A2AFooter, ink brand
color.straw#C4A35AEyebrow, acentos
color.border#D9D2C4Bordes
color.ink#1B3A2A / near-black UITexto
color.ink.muted#6B655CSecundario
color.danger#B91C1C (aprox red-700)Errores
color.primary.softtinte leaf claroBadges, chips

Mapeo Tailwind app

ClaseValor implementado
bg-bg#F3F0E8
bg-surface#FFFFFF
text-ink / ink-muted#1A1814 / #6B655C
primary / primary-soft / primary-strong#3A5A40 / #E2E8E1 / #2A4230
straw#C4A574
border-border#E0D9CC

3. Tipografía

TokenFamiliaFallback
font.displayLiterataGeorgia, serif
font.sansManropesystem-ui, sans-serif
EstiloSpec
Display xlLiterata 36–48/600, leading tight
TitleLiterata 28–32/600
BodyManrope 16/400–500, leading relaxed
LabelManrope 11–12/700 uppercase o tracking wide
ButtonManrope 14/600

4. Espaciado y radio

TokenValor
page padding x16–24px
section y40–56px
card padding16–24px
gap grid12–16px
radius.card16–20px (rounded-2xl)
radius.pill9999px (rounded-full)
header height64–72px

5. Componentes

5.1 Botones

VarianteEstiloUso
Primarybg primary, text white, pillCTA principal, submit, + Tarea
Secondaryborder border, bg surface, pill“Soy técnico”, secundarios
Ghost/texttext muted, hover inkEntrar, Salir

Estados: default · hover (strong) · disabled (opacidad) · focus visible ring.

5.2 Badges de estado

StatusLabelEstilo sugerido
PENDINGPendientesoft primary / muted
ACTIVEActivasoft + acento straw en meta
DONEHechasoft primary
CANCELLEDCanceladamuted / borde dashed opcional

Regla a11y: no codificar solo con color; siempre texto del label.

5.3 Cards de tarea

Estructura:

  1. Meta: code · parcel.name (straw, xs bold)
  2. Título (lg semibold)
  3. Cultivo · hectáreas
  4. Vence + nombre contraparte
  5. Badge status (trailing)

Interacción: bloque entero es enlace a detalle; hover border primary/40.

5.4 Stats tiles

Grid 2×2 mobile / 4 col desktop: TOTAL, ABIERTAS, ACTIVAS, HECHAS.
Número en Literata 2xl; label 11px bold muted.

5.5 Forms

ElementoSpec
Labelsm semibold
Inputborder, radius xl/2xl, padding cómodo touch
Errortext red-700 bajo campo o banner
Submitprimary full o auto

Campos new task: title, parcelName, crop, dueAt, notes, technicianEmail.

5.6 Header app

Logo display · badge rol · nombre · (+ Tarea) · Salir.

5.7 Empty state

Borde dashed, texto centrado, CTA “Crear la primera →” si FARMER.

5.8 Error inline

Párrafo o banner; mensaje accionable (“No se pudieron cargar las tareas.”).

6. Iconografía

v1 sin set de iconos denso. Preferir:

  • Texto y tipografía
  • Badges
  • Emojis no usados en UI profesional

Si se añaden iconos: stroke 1.5–2, color ink/primary, 20–24px.

7. Elevación

NivelUso
0Fondo bone
1Card con border
2Hero image shadow-lg

8. Breakpoints (orientativos Tailwind)

NombreAnchoComportamiento
default<640stack, stats 2 col
sm≥640padding mayor
md≥768home 2 col; stats 4 col

Touch targets: ≥44px en CTAs móviles (doc 10).

9. Do / Don’t

DoDon’t
Usar straw solo en meta/eyebrowsUsar straw como fondo masivo de página
Mantener pills en CTAsBotones square material genéricos
Literata en títulos de secciónLiterata en body largo de form
Estados con label textualSolo verde/rojo sin texto
Microcopy de fincaJerga “sprint”, “ticket backlog”

10. Criterios de aceptación DS

  1. Tokens documentados y reflejados en Tailwind.
  2. Primary contrast aceptable sobre blanco (leaf oscuro).
  3. Empty y error reutilizan patrones de card/borde.
  4. Paper B-0 y UI Angular no divergen en familia tipográfica ni clima de color.

09-content-guide.md

Abrir documento

09 — Guía de contenido — SURCO

1. Voz y tono

DimensiónDefinición
VozClara, cercana al campo, profesional sin corbata
Tono defaultCalmado y resolutivo
Tono errorHonesto, sin culpar, con siguiente paso
Tono emptyInvitador, no vacío existencial
Idiomaes-ES; “tú” de cortesía operativa (no “usted” rígido ni “vos”)

Principios

  1. Preferir hacer sobre gestionar (“Crear tarea”, no “Gestionar ítems”).
  2. Usar dominio real: parcela, bancal, riego, poda, muestreo.
  3. Evitar anglicismos de producto genérico (dashboard, pipeline, owner).
  4. No infantilizar al agricultor ni romanticizar la ruralidad.
  5. Demo credentials visibles donde ayuden al portfolio (footer home).

2. Nombres de producto

CorrectoIncorrecto
SURCO (mayúsculas marca)Surco App Pro
El campo, al día.#1 Farm SaaS
Cuaderno de campo / de parcelaERP agrícola / Farm OS
TareaTicket / Issue
Parcela / bancalPlot genérico sin contexto
TécnicoDriver / Rider

3. Microcopy por pantalla

Home

ElementoCopy
EyebrowAGRO · EXPLOTACIÓN FAMILIAR
H1El campo, al día.
LeadCuaderno digital de parcelas y tareas. El agricultor planifica; el técnico de campo actualiza estado. Sin papeles mojados en la cabina.
CTA primarySoy agricultor
CTA secondarySoy técnico
Header CTAAbrir cuaderno
Pasos01 Defines la parcela · 02 Creas la tarea · 03 Se cierra en campo
Footer demoDemo: campo@surco.agro / tecnico@surco.agro · password123

Login

ElementoCopy sugerido
TítuloEntrar al cuaderno
EmailCorreo
PasswordContraseña
SubmitEntrar
ErrorNo se pudo iniciar sesión. Revisa correo y contraseña.

Lista FARMER

ElementoCopy
EyebrowCUADERNO DE CAMPO
H1Tareas de parcela
CTA+ Tarea
EmptyNo hay tareas todavía. Crear la primera →

Lista TECHNICIAN

ElementoCopy
EyebrowMIS ASIGNACIONES
H1Tareas técnicas
EmptyNo hay tareas todavía. (sin CTA crear)

Stats labels

TOTAL · ABIERTAS · ACTIVAS · HECHAS

Detalle

ElementoCopy
Metacódigo · parcela
AccionesMarcar activa / Hecha / Cancelada (según UI)
Notas vacías(mostrar vacío o “Sin notas”)

Nueva tarea

Campo labelPlaceholder orientativo
Títulop. ej. Riego gota a gota
ParcelaBancal Nord
CultivoOlivo arbequina
Fechaselector date/datetime
Notas2 h sector A
Email técnicotecnico@surco.agro
SubmitCrear tarea

Errores de carga

  • “No se pudieron cargar las tareas.”
  • “No se pudo guardar la tarea.”
  • “Técnico no encontrado.” (API)

Estados (labels)

APIUI
PENDINGPendiente
ACTIVEActiva
DONEHecha
CANCELLEDCancelada

4. Estilo de códigos y datos

DatoFormato
Código tareaSU-0807-01 (mono visual no obligatorio)
Hectáreas2.4 ha (punto decimal OK en demo)
Fechas UIdate:'short' Angular (local)
Roles badgeFARMER / TECHNICIAN (técnico demo; aceptable en badge)

5. Mensajes que no deben aparecer

EvitarMotivo
“Oops! Something went wrong”Idioma y tono genérico
“User not authorized” crudo al farmerPreferir español claro
Marketing de marketplaceFuera de producto
Alarmismo climáticoNo es el job

6. Accesibilidad de contenido

  • Alt hero descriptivo en español.
  • Errores asociados a campos cuando sea form.
  • No usar solo color para “Activa”.
  • Evitar mayúsculas largas en párrafos (solo eyebrows).

7. Criterios de aceptación de contenido

  1. Home y app usan el eslogan oficial.
  2. Empty de farmer incluye camino a crear.
  3. Credenciales demo coherentes en README, seed y footer.
  4. Labels de estado en español en toda la UI.

10-accessibility.md

Abrir documento

10 — Accesibilidad — SURCO

1. Objetivo

Cumplir un nivel WCAG 2.2 AA razonable en el vertical slice web, priorizando:

  • Contraste de texto y CTAs
  • Navegación por teclado
  • Nombres accesibles en controles
  • Estados no solo por color
  • Formularios con errores comprensibles

Contexto de uso: móvil en exterior (técnico) y desktop (planificación). El brillo solar y guantes no se resuelven del todo en web, pero se mitigan con targets grandes y contraste alto leaf/bone.

2. Alcance

En alcance v1Fuera / parcial
Home, login, lista, detalle, newLector de pantalla exhaustivo QA formal
Contraste tokens marcaModo alto contraste OS dedicado
Focus visible navegadorSkip links multi-landmark complejos
Labels de formi18n multi-idioma

3. Contraste

ParIntención
Leaf #3D5C3A sobre blancoCTAs y badges — verificar ≥4.5:1 en texto small
Ink sobre boneBody text
Straw sobre boneSolo eyebrows/meta; si falla, oscurecer straw o usar leaf
White sobre primaryTexto de botón
red-700 sobre boneErrores

Regla: si un acento straw no alcanza contraste en body, no usarlo para texto < 18px esencial.

4. Teclado y foco

ControlComportamiento esperado
Enlaces navTab order lógico header → main
BotonesActivables con Enter/Espacio
FormsTab entre campos; submit con Enter
Cards tareaSon <a> — focuseables
Salirbutton focuseable

Focus visible: outline del navegador o ring Tailwind; no outline: none global.

5. Semántica y estructura

PantallaLandmarks
Homeheader, secciones, footer
Appheader + main
TítulosUn H1 por vista; H2 en cards de lista OK

Imágenes:

  • Hero: alt="Parcelas agrícolas al atardecer"
  • Decorativas: vacías solo si no aportan (evitar en v1)

6. Formularios

RequisitoAplicación
Labels visiblesCada input con label o aria-label
Errores en textoNo solo borde rojo
Passwordtype password; no autocomplete off injustificado
Fechainput date/datetime usable con teclado

7. Color y estado

StatusTexto obligatorioColor de apoyo
Pendiente / Activa / Hecha / CanceladaSí (label)Badge soft
Error redMensaje textualcolor danger
RolBadge FARMER/TECHNICIANsoft primary

8. Touch y móvil de campo

SpecValor
Target mínimo CTA44×44 px
Espacio entre acciones≥8 px
ListaToda la card clicable (área amplia)
ZoomNo bloquear pinch-zoom (user-scalable no desactivado)

9. Movimiento y media

  • Sin autoplay de vídeo.
  • Sin animaciones esenciales para entender estado.
  • Respeto futuro a prefers-reduced-motion si se añaden transitions largas.

10. Pruebas recomendadas

PruebaHerramientaCriterio pass
ContrasteDevTools / axe0 críticos en home+login+form
TecladoManualCompletar login y crear tarea sin ratón
SR spot-checkVoiceOverLabels de form anunciados
Zoom 200%BrowserSin solapamientos graves

11. Criterios de aceptación

  1. Login completible solo con teclado.
  2. Mensajes de error legibles y en español.
  3. Estados de tarea con texto, no solo color.
  4. Hero con alt no vacío.
  5. No hay outline: none sin reemplazo de foco.

11-privacy-security.md

Abrir documento

11 — Privacidad y seguridad — SURCO

1. Contexto

SURCO es un demo de portfolio / vertical slice de cuaderno de campo.
Trata datos de cuenta y notas operativas de finca. No es un producto certificado en producción, pero el diseño aplica controles mínimos serios (JWT, bcrypt, autorización por rol).

No se declara cumplimiento RGPD/LOPDGDD definitivo: en producción real se requieren política de privacidad, base legal documentada y, si hay encargados, DPA.

2. Datos tratados

DatoCategoríaFinalidadSensibilidad
emailIdentificador cuentaLoginPersonal
passwordHashCredencialAuth (nunca password en claro)Crítico
nameIdentidadUI personalizadaPersonal
roleAutorizaciónPermisosOperativo
parcel name, crop, haDatos explotaciónContexto de tareaOperativo
task title, notes, dueAt, status, codeOperativaCuadernoOperativo (notes = texto libre)
technicianId / farmerIdRelacionalAsignaciónOperativo

No se tratan en v1: ubicación GPS, biometría, datos de salud personal, pagos, documentos de identidad, geolocalización de parcelas.

3. Base legítima (modelo producto real)

Si SURCO fuera producción en UE:

TratamientoBase (orientativa)
Cuenta de usuarioEjecución de contrato / medidas precontractuales
Logs técnicosInterés legítimo seguridad
Notas de parcelaEjecución del servicio

Demo: datos seed ficticios; no usar emails reales de terceros sin consentimiento.

4. Controles de seguridad

ControlImplementación v1
Hash de contraseñabcrypt (seed cost 10)
TransporteHTTPS en deploy; HTTP local dev
AuthNJWT firmado (HS256) con secret de entorno
AuthZJwtAuthGuard + checks farmer/technician + FARMER-only create
Validación entradaclass-validator DTOs
Enum statusSolo valores TaskStatus
Secretos.env / Neon URL fuera de git
MinimizaciónSin campos PII extra; sin GPS ni fotos

Matriz de autorización (resumen)

AcciónFARMERTECHNICIAN
Login
List own✓ asignadas
Create✗ 403
Get if party
Patch status if party✓ (subconjunto ACTIVE/DONE/CANCELLED)

5. Amenazas y mitigaciones

AmenazaRiesgoMitigación
Credenciales demo públicasAlto en prod realSolo demo; rotar en prod
JWT robado (XSS)MedioNo guardar datos sensibles extra; CSP futuro; HttpOnly cookie posible evolución
IDOR task idAlto sin checksget/update validan ownership
Enumeración de emails técnicoBajo404 “Técnico no encontrado”
Fuerza bruta loginMedioRate limit futuro (no v1)
SQL injectionBajoPrisma parametrizado
Logs con passwordsAltoNo loguear body de login

6. Retención y borrado (modelo / hipótesis de producto)

DatoRetención demoProducción sugerida
Users seedMientras exista DB demoMientras cuenta activa
TasksHasta delete manual / seed resetp. ej. 24 meses post-cierre (propuesta)
Logs de accesoN/A v190 días (propuesta)
JWTExpiración secret-dependentTTL corto + refresh

v1 no expone endpoint de borrado de cuenta (fuera de alcance).

7. Cookies y tracking

  • Auth en localStorage (token), no cookie de sesión.
  • Sin banners de analytics de terceros en v1.
  • Si se añade analytics (doc 12), minimización IP y consentimiento según base legal.

8. Roles y principio de mínimo privilegio

  • TECHNICIAN no crea tareas ni ve tareas de otros farmers no asignadas.
  • No hay rol ADMIN en v1 (reduce superficie).
  • Parcelas solo del farmer propietario.
  • Email de técnico opcional en create: único PII de “tercero” ligero en el flujo.

9. Incidentes (proceso demo)

  1. Rotar JWT_SECRET y forzar re-login.
  2. Reset seed / rotar passwords demo.
  3. Revisar logs Nest y Neon.
  4. Notificar usuarios afectados si hubiera PII real.
  5. Documentar en memory si afecta al caso.

10. Criterios de aceptación seguridad

  1. Password no se almacena en claro.
  2. /api/tasks sin Bearer → 401.
  3. TECHNICIAN POST /api/tasks → 403.
  4. TECHNICIAN GET tarea de otro → 403.
  5. .env con DATABASE_URL no versionado en repo público (revisar .gitignore).
  6. No se loguean contraseñas ni tokens completos en cliente.

12 — Analytics y métricas — SURCO

1. Propósito

Definir qué medir para validar el cuaderno multi-rol.
v1 implementa stats de dominio (GET /api/tasks/stats/summary) y deja el plan de producto analytics listo; no requiere un vendor concreto (Plausible/GA/etc.) para cerrar el L2.

No se inventan tasas de conversión reales: instrumentar en post-MVP; las cifras de producto son objetivos de modelo, no resultados medidos de campo.

2. North Star y métricas de producto

NivelMétricaDefiniciónFuente
North StarTareas DONE / semana (por explotación activa)Cierres reales de trabajo de campoDB status + fecha updatedAt (futuro)
Activación% logins FARMER que crean ≥1 tarea en 24 hFunnel auth → createeventos + API
Asignación% creates con technicianEmail válidoDelegaciónPOST body / status ACTIVE
Adopción técnico% técnicos con ≥1 patch status / semanaEngagement campoPATCH logs
OperativaMediana horas PENDING→DONEVelocidad de cierretimestamps
FiabilidadTasa error 5xx / 4xx en tasksSalud APIlogs server

3. Funnel UX (modelo)

Home view → Login submit → Login success → List view → Create start → Create success → Status DONE
PasoEvento sugeridoProps
home_viewpagepath=/
login_submitform
login_successauthrole
login_failauthreason=401
tasks_list_viewpagerole, total
task_create_opennav
task_create_submit / successapihas_technician
task_create_failapicode
task_openpageid, status
task_status_changeapifrom, to, role
task_status_doneapisubset cuando to=DONE
week_activederived≥1 login en 7d (retención)

4. Stats in-product (implementado)

GET /api/tasks/stats/summary devuelve:

CampoSignificado
totalTareas visibles al rol
openPENDING + ACTIVE
byStatus.*Conteos por enum

UI: tiles TOTAL / ABIERTAS / ACTIVAS / HECHAS en lista.

Limitación: no es serie temporal; es snapshot del scope del usuario.

5. Segmentos

SegmentoClave
RolFARMER / TECHNICIAN
Con/sin técnicotechnicianId null vs set
ParcelaparcelId / name
Antigüedad tareadueAt vs now (overdue futuro)

6. Privacidad en medición

ReglaDetalle
No enviar password ni token a analytics
Preferir id interno opaco a email en eventos
Notas de tarea: no como propiedad de eventopueden contener info sensible de finca
IP: minimización / retención corta si hay vendor
Demo: analytics opcional desactivable

7. Tablero ops (hipótesis de lectura)

  1. Operación semanal: DONE, open, ACTIVE.
  2. Funnel activación FARMER.
  3. % con técnico asignado.
  4. Salud API: latencia p95 login/list/create.
  5. Empty rate post-login (usuarios sin tareas).

8. Alertas (modelo)

CondiciónSeveridad
Error rate create > 5% 15mAlta
Login fail spikeMedia (posible ataque o seed mal)
0 DONE en 7 días con ACTIVE>0Baja producto

9. Lo que no medimos en v1

  • Heatmaps
  • Session replay
  • A/B testing
  • Attribution marketing multi-canal
  • Tasas de conversión inventadas presentadas como reales

10. Enlace a hipótesis (doc 02)

HipótesisMétrica de esta doc
H1 lista compartida reduce fricción↓ llamadas (cualitativo) + DONE/semana
H2 asignar tech acelera ACTIVE% creates con technician
H3 códigos SU- útiles oralmente(cualitativo futuro)

11. Criterios de aceptación

  1. Stats summary coherente con conteo de lista del mismo usuario.
  2. Documentado el North Star y funnel aunque el vendor no esté cableado.
  3. Ningún evento planeado incluye contenido libre de notes.
  4. Hipótesis H1–H3 enlazan a métricas de esta doc.
  5. Sin stats de mercado falsas en el case.

13 — Plan de QA y pruebas — SURCO

1. Objetivo

Verificar el vertical slice L2 end-to-end: auth multi-rol, listado filtrado, creación, cambio de estado, empty/error, build runnable.

2. Entorno de prueba

ItemValor
APIhttp://localhost:3007
Webhttp://localhost:4200
DBNeon old-paper-48739086 (o local via DATABASE_URL)
Seednpm run db:seed
FARMERcampo@surco.agro / password123
TECHNICIANtecnico@surco.agro / password123

3. Smoke crítico (bloqueante de cierre)

#CasoPasosEsperado
S1Login farmerPOST login / UI login200 + token; redirect lista
S2List farmerGET /api/tasks≥1 task seed; solo suyas
S3StatsGET stats/summarytotal/open/byStatus coherentes
S4CreateUI new task con parcela y dueAparece en lista
S5Assign techcreate con tecnico@…status ACTIVE; tech la ve
S6Login techlogin technicianlista asignaciones
S7Patch DONEdetail → DONEbadge Hecha; stats cambian al reload
S8Authz create techPOST tasks con JWT tech403
S9No tokenGET tasks sin Authorization401
S10Web build/serveng serve o buildsin error compile

Smoke ejecutado / diseñable (2026-08-07)

CasoResultado de diseño
Login farmer / techaccessToken + user.role
GET /tasks farmerseed (5 tareas)
GET stats/summarytotal/open/byStatus
POST /tasks farmercode SU-* ; ACTIVE si tech
PATCH status → DONE200
TECH no creaForbiddenException 403
ng build productionobjetivo OK

4. Casos funcionales por área

4.1 Auth

IDCasoResultado
A1Password incorrecto401 + mensaje UI
A2Email mal formadovalidación
A3Logouttoken limpio; /app/tasks → login
A4Token basura401 en API

4.2 Tareas farmer

IDCasoResultado
F1Lista orden dueAtmás próxima primero
F2Empty si lista []empty + CTA crear
F3Create sin título400 / validación
F4Create parcela nueva nombrese crea parcel
F5Create parcela existentereutiliza
F6Técnico email inexistente404 controlado
F7Detalle propio200
F8Cancelar tareastatus CANCELLED

4.3 Tareas technician

IDCasoResultado
T1No ve “+ Tarea”UI
T2No crea (POST)403 API
T3Solo asignadasfiltro
T4DONE en asignada200
T5Detalle no asignada403

4.4 UI / contenido

IDCasoResultado
U1Home hero + 3 pasosvisibles
U2Labels estado en ESPendiente/Activa/Hecha/Cancelada
U3Error carga listamensaje rojo
U4Responsive 375pxusable sin overflow crítico

5. Pruebas API (ejemplos curl)

# Login
curl -s -X POST http://localhost:3007/api/auth/login \
  -H 'Content-Type: application/json' \
  -d '{"email":"campo@surco.agro","password":"password123"}'

# List (TOKEN=...)
curl -s http://localhost:3007/api/tasks -H "Authorization: Bearer $TOKEN"

# Stats
curl -s http://localhost:3007/api/tasks/stats/summary -H "Authorization: Bearer $TOKEN"

# Create
curl -s -X POST http://localhost:3007/api/tasks \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"title":"Test riego","parcelName":"Bancal Nord","dueAt":"2026-08-10T08:00:00.000Z"}'

# Status
curl -s -X PATCH http://localhost:3007/api/tasks/$ID/status \
  -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
  -d '{"status":"DONE"}'

6. Regresión visual (manual)

PantallaChecklist
HomeLiterata H1, leaf CTAs, hero, footer
Loginform centrado/legible
Listastats 4 tiles, cards, badge rol
Newcampos alineados
Detailacciones estado
Empty/Errorpatrones DS

Comparar con Paper §2–§5 (file 01KZDGF3509TA4WDZTTQJW1V45).

7. Accesibilidad spot-check

Ver doc 10: teclado login+create, contraste botones, alt hero, labels estado.

8. Regresión de datos

  • Seed idempotente (deleteMany + create).
  • Migración Prisma deploy limpia.
  • Códigos SU-* únicos en seed y creates.

9. Criterios de salida (release demo)

  • Smoke S1–S10 en verde
  • Seed reproducible
  • README con puertos 3007/4200
  • Sin secretos en cliente más allá de JWT de sesión
  • Docs case actualizados

10. Bugs conocidos / límites aceptados v1

LímiteNotas
Soft guard solo en clienteAPI es la autoridad real
Código task randomcolisión teórica rara
Sin refresh tokenre-login al expirar
Parcela por texto libretypos crean duplicados lógicos

No son fallos de cierre si están documentados y el smoke pasa.

14 — Handoff a desarrollo — SURCO

1. Fuentes de verdad

ArtefactoUbicación
Case UX/Users/cristian/orca/ux-projects/2026-08-07-surco/
Paperhttps://app.paper.design/file/01KZDGF3509TA4WDZTTQJW1V45
Código/Users/cristian/orca/surco-app/
Schemaapps/api/prisma/schema.prisma
Seedapps/api/prisma/seed.ts
Tokens UIapps/web/tailwind.config.js + docs 07–08

2. Arranque local

cd /Users/cristian/orca/surco-app
cp apps/api/.env.example apps/api/.env   # si existe; configurar DATABASE_URL + JWT_SECRET
npm install --prefix apps/api
npm install --prefix apps/web
npm run db:migrate
npm run db:seed
npm run api    # :3007
npm run web    # :4200

Demo: campo@surco.agro / tecnico@surco.agro · password123

3. Mapa de pantallas → código

UIRutaArchivo
Home/apps/web/src/app/pages/home/home.page.ts
Login/login.../login/login.page.ts
Tasks/app/tasks.../tasks/tasks.page.ts
New/app/tasks/new.../task-new/task-new.page.ts
Detail/app/tasks/:id.../task-detail/task-detail.page.ts
API clientapps/web/src/app/core/api.service.ts
Routesapps/web/src/app/app.routes.ts

4. Mapa API → código

EndpointController/Service
POST /api/auth/loginauth.controller.ts / auth.service.ts
JWT guard/strategyjwt-auth.guard.ts / jwt.strategy.ts
Tasks *tasks.controller.ts / tasks.service.ts

5. Contratos (resumen)

Login request/response

// POST /api/auth/login
{ "email": "campo@surco.agro", "password": "password123" }

// 200
{ "accessToken": "<jwt>", "user": { "id": "...", "email": "...", "name": "Inés Roura", "role": "FARMER" } }

Create task

{
  "title": "string min 3",
  "parcelName": "string min 2",
  "crop": "optional string",
  "dueAt": "ISO-8601",
  "notes": "optional",
  "technicianEmail": "optional email"
}

Status

{ "status": "PENDING" | "ACTIVE" | "DONE" | "CANCELLED" }

6. Reglas de negocio a no romper

  1. Solo FARMER crea tareas.
  2. List/get filtrados por rol (no “list all”).
  3. Parcela se resuelve por nombre + farmerId.
  4. Técnico válido → status inicial ACTIVE.
  5. Código SU-… único.
  6. TECHNICIAN no fuerza estados fuera de su subconjunto permitido en service.

7. Checklist de paridad Paper ↔ app

FrameParidad mínima
C-0 Homehero, eslogan, 3 pasos, CTAs
D-0 Loginemail/password, error
F-0 Tasksstats + lista + rol
G-0 Detailmeta + status actions
H-0 Newform completo
L/M statesempty + error copy

8. Definition of Done (feature nueva)

  • Endpoint con DTO + authz
  • UI con tokens SURCO (no gris genérico)
  • Empty/error si aplica
  • Seed o fixture actualizado
  • Doc 04/05 tocados si cambia flujo o modelo
  • Smoke del flujo en QA 13

9. Deuda técnica conocida (no alcance L2 bloqueante)

ÍtemNota
Guard de rutas Angular formalHoy check en página
Refresh tokenNo
Tests e2e automatizadosPlan manual en doc 13
Selector parcelaTexto libre
i18nSolo es-ES

10. Contacto de decisión de producto

Para cambios de alcance L2 vs L3: ver docs/00-day-brief.md y docs/15-roadmap.md.
No reintroducir marketplace ni GPS fleet sin cambio explícito de brief de diversidad.

15 — Roadmap — SURCO

1. Principio

El L2 del 2026-08-07 está cerrado (auth, tareas, estados, docs, Paper, seed).
Este roadmap lista evoluciones de complejidad (L2+ / L3), no deudas del día.

2. Ahora — v1 entregada (L2)

CapacidadEstado
Home + login JWTHecho
Lista + stats por rolHecho
Create FARMER + parcela implícitaHecho
Detail + patch statusHecho
Empty / errorHecho
Seed Inés / PolHecho

3. Next — endurecer L2 (opcional, misma complejidad)

ÍtemValorEsfuerzo
Route guards Angular canActivateMenos flash de contenidoS
Filtro UI por estadoOps más rápidaS
Selector de parcelas existentesMenos typosM
Confirmación al CANCELLEDMenos erroresS
Tests e2e Playwright smokeRegresiónM

4. Later — L3 posible (nueva decisión de brief)

Solo si un día futuro elige agro L3 (y diversidad lo permite):

TemaPor qué sube de nivel
Multi-finca / multi-técnicoTenancy y permisos
Adjuntos foto de plagaMedia + storage
Offline queue + syncPWA real de campo
Calendario de riego por parcelaPlanificación temporal rica
Export PDF semanaReporting
Notificaciones (email/push)Sistema de eventos

5. No roadmap (explícito)

IdeaMotivo de exclusión
Marketplace de insumosProducto distinto (CORREA-like)
GPS flota cosechadorasTROCHA-like
Cuaderno oficial compliance UE completoLegal/reg tech pesado
PagosFuera de job “cuaderno”

6. Hitos sugeridos (si hubiera continuidad de producto)

HitoObjetivo de métrica
M1 Demo portfolioSmoke 10/10
M2 Pilot 3 fincasactivación create ≥60% logins farmer
M3 Campo realDONE/semana estable; feedback offline

7. Dependencias externas

  • Neon disponibilidad
  • Paper para iteración UI
  • Posible object storage si fotos L3

8. Criterio para abrir L3

  1. Diversidad ALS-2 lo permite (no repetir sector/tipo en cooldown).
  2. Hipótesis H1 validada o refutada con uso real.
  3. Capacidad de cerrar offline o multi-tenant en una iteración si se declara en alcance.

16-interaction-specs.md

Abrir documento

16 — Especificaciones de interacción — SURCO

1. Principios de interacción

PrincipioDetalle
DirectoPocos pasos a create y a DONE
PerdonableErrores con mensaje y reintento manual
Rol-conscienteUI no ofrece acciones imposibles
Campo-first en móvilCards y botones grandes
Sin modales innecesariosFlujos en página (v1)

2. Home

InteracciónComportamiento
Hover CTAsprimary-strong / borde
Click “Abrir cuaderno” / “Entrar” / roles/login
Wordmark/ (reload home)
Hero imageno click (decorativa informativa)

3. Login

EstadoUI
Idleform vacío o browser autofill
Submittingbotón puede deshabilitarse (si implementado)
Successguarda token+user; navigate /app/tasks
Errormensaje bajo form; password no se limpia necesariamente
TecladoEnter envía form

Timing: feedback de error inmediato al 401; sin toast global obligatorio.

4. Lista de tareas

InteracciónComportamiento
LoadGET list + GET stats en paralelo
Click card→ detalle :id
Hover cardborder primary/40, cursor pointer
+ Tareasolo FARMER → /app/tasks/new
Salirclear storage → login
EmptyCTA crear si FARMER
Errortexto; usuario puede recargar página

Stats

Solo lectura; no filtran la lista al click (v1). Futuro: click ACTIVE filtra.

5. Nueva tarea

CampoInteracción
titletext input focus inicial recomendado
parcelNametext; no autocomplete v1
croptext opcional
dueAtdate/datetime-local
notestextarea
technicianEmailemail opcional
SubmitPOST; on success → lista (o detalle)
Cancel/backrouter a lista

Validación: bloquear submit vacío en cliente si se desea; servidor es autoridad.

6. Detalle y estados

AcciónResultado
Ver datoscódigo, título, parcela, notas, personas
Cambiar statusPATCH; actualizar vista local o refetch
Transición a DONEbadge “Hecha”; posible disable de acciones redundantes
Volverlink a lista

Feedback

  • Success: cambio visible del badge (sin modal).
  • Error patch: mensaje “No se pudo actualizar el estado.”

7. Transiciones de estado (UX)

DesdeHaciaQuién típicoCopy botón sugerido
PENDINGACTIVEFarmer o al asignarMarcar activa
ACTIVEDONETécnico / farmerMarcar hecha
*CANCELLEDFarmerCancelar tarea
CANCELLED/DONESolo lectura o reabrir futuro

8. Responsive

BreakpointComportamiento
<640stats 2×2; stack home; header compacto
≥768home 2 col; stats 4 col; form ancho contenido

9. Gestos y no-gestos

  • No swipe-to-done en v1.
  • No drag and drop de prioridades.
  • No long-press menús.

10. Criterios de aceptación interacción

  1. Create → visible en lista sin pasos ocultos.
  2. DONE en ≤3 interacciones desde lista (abrir → acción → hecho).
  3. Técnico nunca ve CTA create.
  4. Errores no silenciosos.

17-prototype-map.md

Abrir documento

17 — Mapa de prototipo — SURCO

1. Qué es el prototipo

CapaRol
PaperHi-fi visual estático por bandas §1–§5
Angular appPrototipo interactivo real (JWT + API + Neon)

Paper no expone prototipo clicable nativo vía MCP; la app es el prototipo navegable.

2. Enlaces

PrototipoURL / path
Paperhttps://app.paper.design/file/01KZDGF3509TA4WDZTTQJW1V45
App localhttp://localhost:4200
API localhttp://localhost:3007
Código/Users/cristian/orca/surco-app/

3. Flujos clicables en app

#FlujoEntradaSalida
1Marketing → login/ CTAs/login
2Login farmercredenciales Inés/app/tasks cuaderno
3Login techcredenciales Pol/app/tasks asignaciones
4Create+ Tareanueva en lista
5Detail statuscardbadge actualizado
6LogoutSalir/login
7Emptylista vacíaCTA crear (farmer)
8ErrorAPI downmensaje

4. Mapa de hotspots (Paper → app)

Artboard PaperHotspot conceptualDestino app
C-0 HomeCTAs/login
D-0 LoginSubmit/app/tasks
F-0 TasksCard/app/tasks/:id
F-0 Tasks+ Tarea/app/tasks/new
H-0 NewGuardar/app/tasks
G-0 DetailStatusmismo :id
J-0 Mobilemismos destinosviewport estrecho

5. Datos del prototipo

Usar seed (no inventar usuarios en UI):

  • Parcelas: Bancal Nord, Surco Baix
  • Tareas: riego, plagas, poda, suelo, abonado
  • Roles: FARMER / TECHNICIAN

Reset: npm run db:seed.

6. Guión de demo (3 minutos)

  1. Home: eslogan y pasos (20 s).
  2. Login Inés (20 s).
  3. Stats + lista (20 s).
  4. Crear “Revisión de goteros” en Bancal Nord, asignar Pol (40 s).
  5. Logout → login Pol (20 s).
  6. Abrir tarea y marcar Hecha (30 s).
  7. Logout; mencionar Paper y stack (30 s).

7. Limitaciones del prototipo

LímiteImpacto en demo
Sin registroSolo seed
Sin notificacionesPol no “recibe push”
Sin mapaParcela es nombre, no geo
Soft client guardDeep link sin token va a login

8. Criterios de aceptación del mapa

  1. Cada pantalla Paper §2–§5 tiene ruta o estado app equivalente.
  2. Demo de 3 min cubre ambos roles.
  3. README enlaza Paper + cómo correr app.

18-completeness-audit.md

Abrir documento

18 — Auditoría de completitud — SURCO (2026-08-07)

1. Alcance auditado

Vertical slice L2: cuaderno parcelas/tareas multi-rol FARMER+TECHNICIAN, con docs, Paper, Angular+Nest+Prisma+Neon.

2. Checklist CRON / ALS-2

RequisitoEstadoEvidencia
Diversidad sector/tipo/nivelOKAgro L2; no marketplace; no GPS fleet
Day brief + anti-patronesOKdocs/00-day-brief.md
Paper bandas §1–§5OKfile 01KZDGF3509TA4WDZTTQJW1V45
Docs 01–20OKsuite en docs/
JWT multi-rolOKFARMER / TECHNICIAN
API + seed + NeonOKold-paper-48739086, port 3007
Web Angular tokensOKLiterata/Manrope, leaf/straw
Smoke login+tasksOKplan 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

4. Cobertura Paper

BandaInventarioNotas
§1 UXCover→Datos (2-0…9-0)doc 00-paper-reference
§2 DS+PublicB-0…D-0tokens + home + login
§3 AppF-0…H-0list detail new
§4 MobileJ-0tasks mobile
§5 StatesL-0 M-0empty error

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

EjeScore 1–5Comentario
Diversidad5Sector nuevo agro
Craft visual4–5Palette + tipo + hero
Densidad UX docs5Suite completa post-rewrite
Completitud código L24–5Vertical slice runnable
Authz5Guard + role checks
Verdad investigación5Sin stats falsas

6. Huecos aceptados (no regresiones de cierre)

HuecoClasificación
OfflineFuera L2
e2e automatizadoPreferible L2+
Route guards formalesL2+
Compliance cuaderno oficialFuera producto

7. Veredicto

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

19-backlog-completo.md

Abrir documento

19 — Backlog completo — SURCO

Inventario de ítems. Los del alcance L2 del día están Done.
El resto es opcional / siguiente nivel, no deuda oculta del cierre §1.1.

1. Done — L2 (2026-08-07)

IDÍtemCapa
D01Definición producto SURCODocs
D02Day brief diversidad agro L2Docs
D03Personas Inés / PolDocs + Paper
D04JTBD + stories MustDocs + Paper
D05IA y flujosDocs
D06Modelo User/Parcel/FieldTaskPrisma
D07Auth JWT loginAPI + Web
D08List tasks por rolAPI + Web
D09Stats summaryAPI + Web
D10Create task FARMERAPI + Web
D11Detail + patch statusAPI + Web
D12Empty + error UIWeb
D13Home marketing multi-secciónWeb
D14Seed demo + NeonData
D15Design tokens leaf/straw/boneWeb + Paper
D16Paper referencia §1–§5Docs + Paper
D17Suite docs 00–20Docs
D18README run 3007/4200Docs

2. Backlog L2+ (misma complejidad, mejoras)

IDÍtemPrioridadNotas
B01canActivate guards AngularP1UX auth
B02Filtros por status en listaP2Query opcional API
B03Select de parcelas existentesP1reduce duplicados
B04Confirm dialog cancelP2
B05Toast de éxito create/statusP3
B06Playwright smoke S1–S10P1CI
B07Skeleton loadingP3
B08Orden/secondary sort por statusP3
B09Editar notas post-createP2PATCH parcial
B10Página 404 amigableP3

3. Backlog L3 (requiere brief nuevo)

IDÍtemDependencia
C01Multi-explotacióntenancy
C02Invitaciones de técnicosemail flows
C03Fotos de campostorage
C04Offline PWA queueservice worker
C05Calendario por parcelaUI densa
C06Export PDF semanalreporting
C07Roles ADMINpermisos
C08Mapa parcelasgeo

4. Explicitamente no-backlog

IdeaRazón
Marketplace insumosFuera de SURCO
Matching tipo CORREAFuera
Dispatch GPS tipo TROCHAFuera
BillingFuera job

5. Orden de ataque recomendado (si hay continuidad)

  1. B01 guards + B06 e2e
  2. B03 selector parcelas
  3. B02 filtros
  4. Evaluar brief L3 solo tras uso real

6. Trazabilidad

OrigenÍtems
Day brief must-haveD01–D18
Doc 15 roadmap nextB01–B10
Doc 15 laterC01–C08

20-implementation.md

Abrir documento

20 — Implementación — SURCO

1. Resumen ejecutivo técnico

CampoValor
App path/Users/cristian/orca/surco-app/
APINestJS · puerto 3007 · prefijo /api
WebAngular standalone · puerto 4200
DBNeon PostgreSQL · Prisma · old-paper-48739086
AuthJWT Bearer · roles FARMER | TECHNICIAN
DominioUser, Parcel, FieldTask
Fecha2026-08-07

2. Cómo arrancar

cd /Users/cristian/orca/surco-app
npm install --prefix apps/api
npm install --prefix apps/web
# Configurar apps/api/.env con DATABASE_URL y JWT_SECRET
npm run db:migrate
npm run db:seed
npm run api   # http://localhost:3007
npm run web   # http://localhost:4200

Credenciales

RolEmailPassword
FARMERcampo@surco.agropassword123
TECHNICIANtecnico@surco.agropassword123

3. Módulos API implementados

Auth

  • POST /api/auth/login
  • Valida email/password; compara bcrypt; emite JWT con sub, email, role.
  • JwtStrategy + JwtAuthGuard protegen tasks.

Tasks

MétodoRutaNotas
GET/api/tasksfiltro por rol
GET/api/tasks/stats/summarytotal, open, byStatus
GET/api/tasks/:idownership check
POST/api/taskssolo FARMER; parcela upsert; tech opcional
PATCH/api/tasks/:id/statusownership + reglas tech

Prisma

Enums Role, TaskStatus; modelos alineados a doc 05; migración init; seed con 2 parcelas y 5 tareas.

4. Frontend implementado

PáginaResponsabilidad
HomePagemarketing, hero, pasos, footer demo
LoginPageform → ApiService.login → navigate tasks
TasksPagestats + list + empty/error + logout
TaskNewPageform create (farmer)
TaskDetailPageget + patch status

ApiService centraliza base URL, token storage, métodos HTTP tipados (FieldTask, TaskStats, User).

5. Decisiones de implementación

DecisiónRazón
Puerto API 3007Evitar colisión con otros daily apps
Soft auth en páginasSimple L2; API sigue siendo autoridad
Parcela por nombre en createMenos pantallas CRUD en L2
Status ACTIVE al asignar techSeñal de “en marcha” sin paso extra
Templates inline standaloneVelocidad de entrega daily; componentes autocontenidos
Stats en endpoint propioEvita recalcular en cliente y permite evolución

6. Variables de entorno

VariableServicioDescripción
DATABASE_URLAPINeon connection string
JWT_SECRETAPIFirma tokens
PORTAPIopcional, 3007

Web: URL de API configurable en service (default localhost:3007).

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

  1. Seed OK en consola (SURCO seed OK).
  2. Login farmer 200.
  3. List length ≥ 1.
  4. Create task 201/200.
  5. Login tech ve tarea si asignada.
  6. Patch DONE 200.
  7. Web muestra badges en español.

8. Estructura de ficheros clave

apps/api/src/main.ts
apps/api/src/auth/*
apps/api/src/tasks/*
apps/api/prisma/schema.prisma
apps/api/prisma/seed.ts
apps/web/src/app/app.routes.ts
apps/web/src/app/core/api.service.ts
apps/web/src/app/pages/**/**
apps/web/tailwind.config.js
apps/web/src/styles.css

9. Despliegue (notas)

No obligatorio para cierre local del case. Sugerencia:

PiezaOpción
APIRailway / Fly / Render
WebNetlify / Vercel (static Angular)
DBNeon (ya)
CORSorígenes del front deploy

10. Criterios de aceptación de implementación

  1. Comandos del README reproducen el entorno.
  2. Ambos roles demuestran flujos distintos.
  3. 403/401 correctos en pruebas de authz.
  4. UI usa tokens de marca (no default blue Tailwind).
  5. Case docs enlazan Paper, Neon id, puertos y demos.