00-day-brief.md
Abrir documentoDay brief — 2026-08-07 — ALS-2
1. LOAD — restricciones del día
| Eje | Decisión | Motivo (diversidad) |
|---|---|---|
| Complejidad | Nivel 2 | Tras CORREA (L3 marketplace) no se repite L3 consecutivo. L2 = dominio acotado, multi-rol JWT, CRUD de entidad core + estados. |
| Sector | Agricultura / explotación familiar | No usado en la serie (COMAL cocina, ATRIO museo, MERIDIANA clínica, SENDA mayores, FIRME legal, TROCHA logística, CORREA mascotas). |
| Tipo de producto | Cuaderno digital de parcelas + tareas | Tool ops de campo, no marketplace, no SaaS legal, no flota GPS. |
| Auth | JWT multi-rol FARMER + TECHNICIAN | Directiva D-P1-05; panel no abierto. |
| Craft mínimo | ≥ CORREA densificado | Rúbrica no baja; L2 ≠ menos detalle visual ni docs thin. |
| Cierre | §1.1 completo en una iteración | Docs + Paper + app + Neon + smoke; sin “próximos pasos de producto del día”. |
| Puerto API | 3007 | Evitar colisión con CORREA (3006) y anteriores. |
Anti-patrones a evitar (top del catálogo)
| ID | Anti-patrón | Mitigación hoy |
|---|---|---|
| AP-thin-docs | Docs de 1–2 líneas | Suite 00–20 con tablas, AC y criterios de aceptación |
| AP-generic-ui | UI “SaaS genérico” / “básica porque L2” | Palette bone × leaf × straw; Literata + Manrope |
| AP-no-auth | Panel sin login | JWT obligatorio en /api/tasks* |
| AP-marketplace-copy | Lógica de marketplace en tool ops | No catálogo, no ratings, no checkout |
| AP-gps-fleet | Flota/ruta tipo TROCHA | Parcelas y tareas de campo, sin GPS ni paradas de reparto |
| AP-fake-research | Estadísticas inventadas como primarias | Solo hipótesis y supuestos etiquetados |
| AP-open-debt | Backlog de features del L2 del día | Vertical slice cerrado: listar, crear, detalle, status |
| AP-canvas-chaos | Paper 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 buildo serve OK. - Docs en español, profundidad tipo portfolio (no stubs).
2. BRIEF — concepto del día
| Campo | Valor |
|---|---|
| Nombre | SURCO |
| Eslogan | ”El campo, al día.” |
| Una frase | Cuaderno digital de parcelas y tareas de campo para explotaciones familiares, con roles agricultor y técnico. |
| Tipo | Tool ops L2 — cuaderno multi-rol (no marketplace, no fleet) |
| Roles | FARMER (Inés Roura) · TECHNICIAN (Pol Vidal) |
| Dominio | Parcel + FieldTask (PENDING | ACTIVE | DONE | CANCELLED) + User |
| Estilo | Bone #F4F0E6 × Leaf #3D5C3A / #1B3A2A / #2A4A32 × Straw #C4A35A |
| Tipo | Literata (display) + Manrope (UI) |
| Stack | Angular + NestJS + Prisma + Neon + Tailwind + JWT |
| Paper | https://app.paper.design/file/01KZDGF3509TA4WDZTTQJW1V45 |
| Neon | old-paper-48739086 · API :3007 · Web :4200 |
| App | /Users/cristian/orca/surco-app/ |
Por qué L2 agro (y no otra cosa)
- Diversidad de sector: la serie no había tocado agricultura; cierra un hueco frente a legal, logística y marketplace.
- 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.
- Diferenciación vs TROCHA: TROCHA es flota última milla + paradas GPS/ruta; SURCO es cuaderno de explotación (bancales, cultivos, riego/poda/muestreo).
- Diferenciación vs CORREA: CORREA es marketplace B2C con mascotas y reservas; SURCO es tool interno de finca, sin catálogo ni matching.
- 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)
| # | Entrega | Criterio done |
|---|---|---|
| 1 | Home marketing | Hero real, 3 pasos, CTAs rol, footer demo |
| 2 | Login JWT | FARMER y TECHNICIAN; redirect a tareas |
| 3 | Lista tareas + stats | Filtro por rol; chips de estado; empty |
| 4 | Detalle + cambio de estado | PATCH status; permisos por rol |
| 5 | Nueva tarea (solo FARMER) | Parcela por nombre, dueAt, técnico opcional |
| 6 | Empty / error | Sin tareas; fallo de red en lista |
| 7 | Paper §1–§5 | UX process + DS + app + mobile + states |
| 8 | Docs 00–20 + README + executive | Portfolio 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
| ID | Aplicación en SURCO |
|---|---|
| D-P0-01 | L2 no reduce craft ni profundidad de docs |
| D-P0-02 | Hi-fi con media real (assets/hero.jpg), microcopy agro |
| D-P0-03 | Angular + Nest + Neon + Tailwind + repo app |
| D-P0-04 | Canvas Paper en bandas §1–§5 con labels |
| D-P0-05 | Hero fotorrealista en case y app |
| D-P0-06 | Cierre §1.1 sin backlog del alcance L2 |
| D-P1-01 | ≥8 artboards UX en Paper (stakeholders → datos) |
| D-P1-02 | Tokens leaf/straw/bone en Angular |
| D-P1-03 | apps/api + apps/web independientes |
| D-P1-05 | JWT en todas las rutas de tareas |
| D-P1-06 | Smoke login + GET/POST/PATCH tasks |
4. Cuentas demo
| Rol | Nombre | Password | |
|---|---|---|---|
| FARMER | Inés Roura | campo@surco.agro | password123 |
| TECHNICIAN | Pol Vidal | tecnico@surco.agro | password123 |
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 documentoReferencia Paper — SURCO
| Campo | Valor |
|---|---|
| File ID | 01KZDGF3509TA4WDZTTQJW1V45 |
| URL | https://app.paper.design/file/01KZDGF3509TA4WDZTTQJW1V45 |
| Nombre | SURCO — Daily UX 2026-08-07 |
| Producto | Cuaderno digital parcelas + tareas multi-rol (L2) |
| Artboards | ~22 (+ labels de banda) |
| Bandas | §1 UX · §2 Design + Public · §3 App · §4 Mobile · §5 States |
| Idioma UI | es-ES |
| Media | assets/hero.jpg (parcelas al atardecer) |
1. Mapa de canvas (bandas jerárquicas)
| § | Banda | Propósito | Artboards clave |
|---|---|---|---|
| 1 | UX PROCESS | Investigación y modelo de servicio (densidad visual) | Cover, Stakeholders, Personas, JTBD, Journey, Blueprint, IA, Datos |
| 2 | DESIGN + PUBLIC | Sistema visual y cara pública | Design System, Home marketing, Login |
| 3 | APP | Flujos autenticados desktop/tablet | Tasks list, Task detail, New task |
| 4 | MOBILE | Operación en cabina / móvil de campo | Tasks mobile |
| 5 | STATES | Resiliencia UI | Empty, 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
| Label | Nombre | Contenido |
|---|---|---|
| 1-0 | §1 UX PROCESS | Etiqueta de banda |
| 2-0 | UX-00 Cover | Portada SURCO, eslogan, fecha 2026-08-07, L2 agro, roles, dark leaf |
| 3-0 | UX-01 Stakeholders | Mapa interés/influencia: agricultora, técnico, familia, asesoría, normativa |
| 4-0 | UX-02 Personas | Inés Roura (FARMER) · Pol Vidal (TECHNICIAN) — goals, pains, quote |
| 5-0 | UX-03 JTBD | Job principal + funcional/emocional/social + MoSCoW / stories Must |
| 6-0 | UX-04 Journey | 5 fases farmer: planifica → asigna → Pol ejecuta → cierra DONE |
| 7-0 | UX-05 Blueprint | Frontstage app · backstage finca · sistemas · fallos red/estado |
| 8-0 | UX-06 IA | Sitemap público/auth/roles; navegación y permisos |
| 9-0 | UX-07 Datos | ERD: User, Parcel, FieldTask + enums Role, TaskStatus |
§2 — DESIGN + PUBLIC
| Label | Nombre | Contenido |
|---|---|---|
| A-0 | §2 DESIGN + PUBLIC | Etiqueta de banda |
| B-0 | 00 Design System | Color bone/leaf/straw, tipo Literata+Manrope, botones, badges estado, cards |
| C-0 | 01 Home | Nav, hero + media, cómo funciona (3 pasos), CTAs rol, footer demo |
| D-0 | 02 Login | Split dark/form; email/password; contexto cuaderno de campo |
§3 — APP (desktop)
| Label | Nombre | Contenido |
|---|---|---|
| E-0 | §3 APP | Etiqueta de banda |
| F-0 | 03 Tasks Farmer | Lista + stats summary; badge rol; CTA + Tarea |
| G-0 | 04 Task Detail | Código SU-…, parcela, notas, chips estado, acciones de transición |
| H-0 | 05 New Task | Form: título, parcela, cultivo, dueAt, notas, email técnico opcional |
§4 — MOBILE
| Label | Nombre | Contenido |
|---|---|---|
| I-0 | §4 MOBILE | Etiqueta de banda |
| J-0 | 06 Mobile Tasks | Vista ~390px técnico en campo; touch targets ≥44px |
§5 — STATES
| Label | Nombre | Contenido |
|---|---|---|
| K-0 | §5 STATES | Etiqueta de banda |
| L-0 | 07 Empty | Sin tareas; CTA crear (solo FARMER) |
| M-0 | 08 Error | Fallo 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 | Sí | Sí | Sí | Sí |
| Microcopy real (no lorem) | Sí | Sí | Sí | Sí |
| Tokens de color aplicados | — | Sí | Sí | Sí |
| Datos de seed creíbles | Personas | Demo emails | Códigos SU-… | Empty realista |
| Media / iconografía | Cover | Hero | Badges | Alertas |
4. Mapeo Paper → Angular
| Artboard | Ruta app | Componente |
|---|---|---|
| C-0 Home | / | HomePage |
| D-0 Login | /login | LoginPage |
| F-0 Tasks | /app/tasks | TasksPage |
| G-0 Detail | /app/tasks/:id | TaskDetailPage |
| H-0 New | /app/tasks/new | TaskNewPage |
| J-0 Mobile | mismas rutas, viewport estrecho | responsive |
| L-0 Empty | /app/tasks (0 items) | empty state en lista |
| M-0 Error | lista / detalle | mensajes error en páginas |
5. Tokens de diseño en Paper
| Token | Valor | Uso |
|---|---|---|
| Bone / bg | #F4F0E6 | Fondo de página |
| Leaf | #3D5C3A | Primary, CTAs, marca |
| Leaf deep | #1B3A2A | Ink de acento / footer / covers dark |
| Leaf mid | #2A4A32 | Hover / strong |
| Soft leaf | #E8EFE4 | Fondos suaves / badges |
| Straw | #C4A35A | Eyebrows, acentos de cultivo |
| Border | #D9D2C4 | Bordes de card y inputs |
| Display | Literata | H1–H2, logo wordmark |
| UI | Manrope | Body, labels, botones |
Nota implementación:
tailwind.config.jsde 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
- Paper: https://app.paper.design/file/01KZDGF3509TA4WDZTTQJW1V45
- Case:
/Users/cristian/orca/ux-projects/2026-08-07-surco/ - App:
/Users/cristian/orca/surco-app/ - Neon project:
old-paper-48739086
01-project-definition.md
Abrir documento01 — Definición de proyecto — SURCO
1. Identidad
| Campo | Valor |
|---|---|
| Nombre | SURCO |
| Significado | Surco 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 frase | Cuaderno digital de parcelas y tareas para explotaciones familiares, con agricultor y técnico de campo. |
| Sector | Agricultura / explotación familiar |
| Tipo | Tool ops multi-rol (cuaderno de campo) — Nivel 2 |
| Plataforma | Web responsive (desktop planificación + móvil de campo) |
| Mercado demo | España (finca familiar mediterránea: olivo, almendro) |
| Idioma | es-ES |
| Fecha caso | 2026-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
| Problema | Quién lo sufre | Efecto |
|---|---|---|
| Tareas “en la cabeza” del dueño | FARMER | Olvidos, re-trabajo, visitas innecesarias |
| Técnico sin lista clara del día | TECHNICIAN | Llamadas para preguntar “¿qué hago en el bancal X?” |
| Sin código ni fecha de vencimiento | Ambos | Difícil priorizar con varios bancales |
| Papel mojado / ilegible en cabina | Ambos | Pé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
| ID | Hipótesis | Señal de validación (futura) |
|---|---|---|
| H1 | Un listado compartido con estados reduce llamadas de “¿ya regaste?” | ↓ mensajes de estado / semana |
| H2 | Asignar técnico en la creación acelera el paso a ACTIVE | % tareas con technicianId en <24 h |
| H3 | Códigos cortos SU-MMDD-XX facilitan referencia oral en campo | Uso 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
| Para | Valor |
|---|---|
| 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ón | Un cuaderno digital mínimo viable sin ERP ni GPS de flotas. |
No es SURCO
| Excluido | Por qué |
|---|---|
| Marketplace de insumos o servicios | Eso sería CORREA-like; no es tool de finca |
| Consola GPS / última milla | Eso es TROCHA |
| SaaS legal / expedientes | Eso es FIRME |
| Cuaderno oficial de explotación (compliance) | Alcance regulatorio > L2 |
| Multi-tenant SaaS agro enterprise | Complejidad 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
| Rol | Objetivo medible en demo |
|---|---|
| FARMER | Crear tarea en < 2 min; ver summary de abiertas |
| TECHNICIAN | Marcar 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ón | FARMER | TECHNICIAN |
|---|---|---|
| Login JWT | Sí | Sí |
| Listar tareas propias | Sí (como farmer) | Sí (asignadas) |
| Ver stats summary | Sí | Sí |
| Crear tarea | Sí | No (403) |
| Ver detalle si es parte | Sí | Sí si technicianId |
| Cambiar status | Sí (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)
| Tipo | Métrica | Definición |
|---|---|---|
| North Star | Tareas DONE / semana | Cierre real de trabajo de campo |
| Activación | 1ª tarea creada por FARMER | Post-login create |
| Engagement | % tareas con técnico asignado | ACTIVE con technicianId |
| Operativa | Tiempo PENDING → DONE | Mediana por parcela |
| Calidad | Tasa error API en list/create | 4xx/5xx |
7. Alcance funcional v1 (L2)
| Módulo | Incluido |
|---|---|
| Home pública | Hero, 3 pasos, CTAs |
| Auth | POST /api/auth/login → JWT |
| Tareas | GET list, GET by id, POST create, PATCH status, GET stats |
| Parcelas | Creadas implícitamente por nombre en create |
| UI estados | Loading implícito, empty, error de red |
| Seed | 2 usuarios, 2 parcelas, 5 tareas |
8. Criterios de aceptación de producto
- Un FARMER puede iniciar sesión y ver solo sus tareas ordenadas por
dueAt. - Un TECHNICIAN ve solo tareas donde
technicianId= su id. - Crear tarea exige título, nombre de parcela y fecha; opcional técnico por email → status ACTIVE.
- El detalle muestra código, parcela, cultivo, ha, notas y permite cambiar estado.
- Sin token, las rutas
/api/tasks*responden 401. - La home comunica “cuaderno”, no marketplace ni flota.
9. Stack y artefactos
| Capa | Detalle |
|---|---|
| Frontend | Angular + Tailwind · puerto 4200 |
| Backend | NestJS · puerto 3007 |
| DB | Neon PostgreSQL · Prisma · project old-paper-48739086 |
| Auth | JWT (passport/strategy en API) |
| Diseño | Paper 01KZDGF3509TA4WDZTTQJW1V45 |
| Repo app | /Users/cristian/orca/surco-app/ |
10. Riesgos y mitigaciones
| Riesgo | Impacto | Mitigación v1 |
|---|---|---|
| Confundir con ERP agro | Expectativa inflada | Copy “cuaderno”, alcance L2 en docs |
| Offline real de campo | Técnico sin red | Documentado fuera de alcance; UI de error clara |
| Confusión de roles | 403 inesperado | Badge de rol en header; solo FARMER ve “+ Tarea” |
| Parcela duplicada por typo | Datos sucios | findFirst por nombre; mejora futura: selector |
11. Glosario
| Término | Definición en SURCO |
|---|---|
| Parcela / bancal | Unidad de tierra con nombre, cultivo y hectáreas |
| Tarea de campo | Trabajo planificado (riego, poda, muestreo…) con estado y vencimiento |
| Cuaderno | Vista principal de tareas + stats del usuario |
| Código SU- | Identificador corto oral (SU-0807-01) |
02-ux-research-strategy.md
Abrir documento02 — 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)
| Objetivo | Método en este caso | Salida |
|---|---|---|
| Entender roles de finca familiar | Modelado de stakeholders + personas | §3–4 |
| Definir job principal | JTBD + stories Must | §5 |
| Mapear fricción de coordinación | Journey + service blueprint | §6–7 |
| Traducir a requisitos L2 | Matriz 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
| Prohibido | Permitido |
|---|---|
| “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 reales | Quotes de persona etiquetadas como constructo de diseño |
| NPS inventado | Hipótesis H1–H3 con métrica futura |
3. Stakeholders
| Stakeholder | Influencia | Interés | Necesidad principal |
|---|---|---|---|
| Agricultora titular (FARMER) | Alta | Muy alta | Planificar y ver estado de bancales |
| Técnico de campo (TECHNICIAN) | Media–Alta | Alta | Lista del día y cierre rápido |
| Familia / mano de obra ocasional | Baja formal | Media | Instrucciones claras (fuera de app v1) |
| Asesoría agronómica externa | Media | Media | Trazabilidad ligera de intervenciones |
| Normativa / cuaderno oficial | Alta potencial | Baja en v1 | Fuera de alcance L2 (no simular compliance) |
| Proveedor de insumos | Baja | Baja | No 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
| Campo | Detalle |
|---|---|
| Edad / contexto | ~42 años; explotación familiar olivo + almendro |
| Digital | Media–alta (móvil y banca online); poco tiempo de escritorio al mediodía |
| Goals | Tener el día de parcelas “al día”; no depender solo de la memoria |
| Pains | Notas 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 demo | campo@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
| Campo | Detalle |
|---|---|
| Edad / contexto | ~31 años; técnico de campo que apoya varias fincas (en demo: la de Inés) |
| Digital | Alta; prefiere móvil con una mano |
| Goals | Ver asignaciones, ejecutar, marcar hecha sin llamadas de ida y vuelta |
| Pains | Listas 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 demo | tecnico@surco.agro |
Escenario: Abre SURCO en el móvil, ve ACTIVE, ejecuta, pasa a DONE.
Anti-persona
| Quién | Por qué no es target v1 |
|---|---|
| Director de cooperativa multi-finca con ERP | Necesita multi-tenant, reporting y compliance → L3/L4 |
| Operador de flota de cosechadoras con GPS | Producto 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
| Job | Rol |
|---|---|
| Ver cuántas tareas abiertas tengo | Ambos |
| Cerrar una intervención hecha en campo | TECHNICIAN / FARMER |
| Referir una tarea por código corto en llamada | Ambos |
Stories Must (v1)
| ID | Story | AC resumido |
|---|---|---|
| E1 | Como usuario, inicio sesión con email/password y recibo JWT | 200 + token; 401 si mal |
| E2 | Como FARMER, listo mis tareas y un summary por estado | GET list + stats |
| E3 | Como TECHNICIAN, listo solo mis asignaciones | Filtro technicianId |
| E4 | Como FARMER, creo tarea con parcela y vencimiento | POST; parcela upsert por nombre |
| E5 | Como FARMER, puedo asignar técnico por email | status ACTIVE si existe |
| E6 | Como participante, cambio estado de la tarea | PATCH status + permisos |
| E7 | Como visitante, entiendo el valor en la home | CTAs “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)
| Fase | Acción | Touchpoint | Emoción |
|---|---|---|---|
| Descubrir | Entra a home SURCO | Web pública | Curiosidad |
| Entrar | Login FARMER | /login | Confianza (demo clara) |
| Planificar | Revisa stats y lista | /app/tasks | Control |
| Crear | Nueva tarea riego | /app/tasks/new | Alivio |
| Delegar | Asigna tecnico@… | Create con email | Coordinación |
| Esperar | Pol trabaja en campo | Fuera de app | Neutro |
| Cerrar | Ve DONE en lista/detalle | App | Satisfacción “al día” |
Journey — Pol (campo)
Login → Mis asignaciones → Detalle → ACTIVE (si aplica) → DONE → siguiente tarea.
7. Service blueprint (simplificado)
| Capa | Elementos |
|---|---|
| Evidencia | Home, login, lista, detalle, códigos SU- |
| Frontstage | Acciones de usuario en Angular |
| Backstage | NestJS + Prisma + Neon; seed de parcelas |
| Soporte | Credenciales demo en footer; mensajes error red |
| Fallos | 401 token; 403 create tech; 404 técnico email; red caída → UI error |
8. Hallazgos → requisitos → features
| Hallazgo (etiquetado) | Requisito | Feature v1 |
|---|---|---|
| [SUPUESTO] Coordinación informal pierde estado | Estado explícito de tarea | Enum PENDING/ACTIVE/DONE/CANCELLED |
| [HIPÓTESIS H1] Lista compartida reduce fricción | Vistas por rol | Filtro farmerId / technicianId |
| [DECISIÓN] Técnico opera en móvil | Touch-friendly list/detail | Cards grandes, CTAs claros |
| [DECISIÓN] No ERP | Mínimo de campos | title, parcel, dueAt, notes, tech opcional |
| [SUPUESTO] Referencia oral en finca | Código corto | SU-MMDD-XXX |
| [DECISIÓN] No compliance legal | No módulos ROPO/cuaderno oficial | Fuera de alcance documentado |
9. Preguntas abiertas (investigación futura real)
- ¿Cuántas tareas activas gestiona una finca familiar en semana de riego?
- ¿El técnico es empleado fijo o asesor multi-finca? (impacta multi-tenant)
- ¿Qué % del tiempo de campo hay cobertura de datos? (offline)
- ¿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étodo | Muestra | Éxito |
|---|---|---|
| Guerrilla test 5 agricultores/técnicos | 5 | Completar create + done sin ayuda |
| Analytics (si se instrumenta) | Demo | activation + north star |
| Entrevista contextual en finca | 3 | Confirmar 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 documento03 — Arquitectura de información — SURCO
1. Principios de IA
| Principio | Aplicación |
|---|---|
| Cuaderno primero | Tras login, destino único: lista de tareas (no dashboard multi-widget) |
| Rol visible | Badge FARMER / TECHNICIAN en header de app |
| Pocos niveles | Público (2) + App (3 rutas) — profundidad máxima 2 clicks a detalle |
| Permisos en navegación | CTA “+ Tarea” solo FARMER; rutas API con guard |
| Lenguaje de dominio | Parcela, 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
| Audiencia | Nodos relevantes |
|---|---|
| Visitante | Home → Login |
| FARMER | Login → Tasks → New / Detail |
| TECHNICIAN | Login → Tasks → Detail (status) |
3. Navegación
Pública
| Elemento | Destino | Notas |
|---|---|---|
| Wordmark SURCO | / | Display Literata |
| Entrar | /login | Texto |
| Abrir cuaderno | /login | Primary CTA |
| Soy agricultor / Soy técnico | /login | Mismo form; rol viene del usuario seed |
App (autenticada)
| Elemento | Destino | Visibilidad |
|---|---|---|
| Wordmark | /app/tasks | Ambos |
| Badge rol | — | Ambos |
| Nombre usuario | — | Ambos |
| + Tarea | /app/tasks/new | Solo FARMER |
| Salir | limpia token → /login | Ambos |
| Card tarea | /app/tasks/:id | Ambos |
| Volver (detalle) | /app/tasks | Ambos |
No hay menú lateral multi-sección en v1 (evita IA de ERP).
4. Inventario de contenido
| Pantalla | Contenidos |
|---|---|
| Home | Eyebrow sector, H1 eslogan, lead, CTAs, 3 stats teaser, hero img, 3 pasos, footer demo |
| Login | Título, email, password, submit, error, enlace implícito a demo |
| Tasks | Título contextual por rol, 4 stats, lista cards, empty, error |
| New | Form campos, submit, cancel/back |
| Detail | Meta código/parcela, notas, selector/acciones de estado |
5. Taxonomía y etiquetas de estado
| Status API | Label UI | Semántica |
|---|---|---|
PENDING | Pendiente | Creada; sin técnico o aún no activa |
ACTIVE | Activa | En curso / asignada |
DONE | Hecha | Cerrada con éxito |
CANCELLED | Cancelada | No se hará |
Orden de lista: por dueAt ascendente (lo que vence antes, primero).
6. Modelo mental vs UI
| Modelo mental del usuario | Representació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
| Objeto | Quién crea | Quién ve | Quién muta status |
|---|---|---|---|
| Parcel | FARMER (implícito en create task) | Vía tarea | No hay CRUD UI aparte |
| FieldTask | FARMER | Farmer dueño o tech asignado | Participante según reglas API |
8. Flujos de información entre roles
- FARMER crea tarea (+ opcional email técnico) → si hay técnico válido,
ACTIVE. - TECHNICIAN lista solo asignadas → actualiza a
DONE. - 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)
| URL | indexable | Motivo |
|---|---|---|
/ | Sí (demo) | Marketing del caso |
/login | Noindex preferible | Auth |
/app/* | No | Privado |
10. Criterios de aceptación IA
- Desde home, un usuario llega a login en 1 click.
- Tras login válido, aterriza en lista de tareas.
- Ninguna ruta de app asume rol incorrecto en la nav (sin “+ Tarea” para técnico).
- Detalle y new son hijos semánticos de tasks (path prefix
/app/tasks). - No existen secciones huérfanas (inventario, mapa, chat) en la nav.
04-user-flows.md
Abrir documento04 — 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)
| Paso | Acción | Sistema |
|---|---|---|
| 1 | Lee valor y pasos 01–03 | Render estático |
| 2 | Click CTA | Router → /login |
| 3 | Opcional: lee credenciales demo en footer | Copy |
É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
| Campo | Validación cliente (mín.) | API |
|---|---|---|
| required, email | @IsEmail() | |
| password | required, min 6 | @MinLength(6) |
Éxito: token guardado; user con role FARMER o TECHNICIAN.
Errores:
| Caso | Comportamiento |
|---|---|
| Credenciales inválidas | 401 + mensaje “No se pudo entrar…” |
| Red caída | Error de red en UI |
| Ya autenticado visita /login | Puede 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
| Rol | Filtro servidor |
|---|---|
| FARMER | farmerId = userId |
| TECHNICIAN | technicianId = userId |
Orden: dueAt ASC.
Include: farmer, technician, parcel.
Variantes de UI
| Estado datos | UI |
|---|---|
| loading | (implícito hasta next) |
| items.length = 0 | Empty L-0 + CTA crear si FARMER |
| error HTTP | Mensaje rojo M-0 |
| OK | Lista + stats TOTAL / ABIERTAS / ACTIVAS / HECHAS |
AC:
- Sin token → redirect
/login. - Técnico no ve botón “+ Tarea”.
- 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
| Campo | Obligatorio | Notas |
|---|---|---|
| title | Sí | min 3 |
| parcelName | Sí | min 2; upsert parcela del farmer |
| crop | No | default “Cultivo” si parcela nueva |
| dueAt | Sí | ISO date string |
| notes | No | default "" |
| technicianEmail | No | si válido TECHNICIAN → status ACTIVE |
Lógica de negocio
- Buscar parcela del farmer por
name; si no existe, crear conhectares: 1y crop dado. - Si
technicianEmail: buscar user role TECHNICIAN; si no, 404 “Técnico no encontrado”. - Generar
code=SU-+ MMDD +-+ random 100–999. - Status inicial:
PENDINGsin técnico;ACTIVEcon técnico.
Errores:
| Caso | HTTP | UI |
|---|---|---|
| TECHNICIAN llama create | 403 | No debería llegar (sin nav) |
| Email técnico inexistente | 404 | Mensaje form |
| Validación | 400 | Mensaje campos |
| Red | — | Error 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
| Rol | Condición | Si falla |
|---|---|---|
| FARMER | task.farmerId === userId | 403 |
| TECHNICIAN | task.technicianId === userId | 403 |
| — | no existe | 404 |
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
| ID | Escenario | Respuesta |
|---|---|---|
| E-401 | Token ausente/expirado en API | 401; cliente → login |
| E-403 | Técnico crea tarea / ve tarea ajena | 403; mensaje o redirect |
| E-404 | id inexistente o técnico email | 404 |
| E-net | API caída | Copy de error; reintento manual (reload) |
| E-empty | 0 tareas | Empty 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
| Flujo | Guest | FARMER | TECHNICIAN |
|---|---|---|---|
| F1 Home | ✓ | ✓ | ✓ |
| F2 Login | ✓ | ✓ | ✓ |
| F3 List | — | ✓ | ✓ |
| F4 Create | — | ✓ | ✗ |
| F5 Status | — | ✓ | ✓ (asignadas) |
| F6 Logout | — | ✓ | ✓ |
05-data-model.md
Abrir documento05 — Modelo de datos — SURCO
1. Visión general
Dominio mínimo de cuaderno de campo L2:
| Entidad | Propósito |
|---|---|
| User | Identidad + rol FARMER | TECHNICIAN |
| Parcel | Bancal / parcela de la explotación del farmer |
| FieldTask | Tarea de campo con estado, vencimiento y asignación opcional |
Base: PostgreSQL (Neon) · ORM: Prisma · IDs: cuid().
2. Enums
Role
| Valor | Descripción |
|---|---|
FARMER | Titular / planificador; crea tareas y parcelas |
TECHNICIAN | Ejecutor de campo; ve asignaciones |
TaskStatus
| Valor | Descripción |
|---|---|
PENDING | Planificada; sin arrancar o sin técnico |
ACTIVE | En curso (p. ej. al asignar técnico) |
DONE | Completada |
CANCELLED | Anulada |
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
| Campo | Tipo | Constraints |
|---|---|---|
| id | String | PK, cuid |
| String | unique | |
| passwordHash | String | bcrypt |
| name | String | |
| role | Role | |
| createdAt | DateTime | default now |
| updatedAt | DateTime | updatedAt |
| parcels | Parcel[] | |
| tasksFarmer | FieldTask[] | rel “FarmerTasks” |
| tasksTech | FieldTask[] | rel “TechTasks” |
Parcel
| Campo | Tipo | Constraints |
|---|---|---|
| id | String | PK |
| name | String | nombre de bancal (no unique global; lookup por farmer+name) |
| crop | String | cultivo |
| hectares | Float | |
| farmerId | String | FK User |
| tasks | FieldTask[] | |
| createdAt | DateTime |
FieldTask
| Campo | Tipo | Constraints |
|---|---|---|
| id | String | PK |
| code | String | unique, formato SU-MMDD-XXX |
| title | String | |
| notes | String | default "" |
| status | TaskStatus | default PENDING |
| dueAt | DateTime | |
| farmerId | String | FK |
| technicianId | String? | FK opcional |
| parcelId | String | FK |
| createdAt / updatedAt | DateTime |
5. Reglas de integridad y negocio
| Regla | Implementación |
|---|---|
| Solo FARMER crea tareas | Controller: role check → 403 |
| Lista filtrada por rol | where farmerId o technicianId |
| Acceso a detalle | Mismas condiciones o 403 |
| Parcela al vuelo | findFirst name+farmer; else create |
| Técnico por email | User.role debe ser TECHNICIAN |
| Código único | unique en DB; generación en service |
| Password | Nunca en claro; solo passwordHash |
6. Seed de referencia (2026-08-07)
| Entidad | Datos |
|---|---|
| FARMER | Inés Roura · campo@surco.agro · password123 |
| TECHNICIAN | Pol Vidal · tecnico@surco.agro · password123 |
| Parcel 1 | Bancal Nord · Olivo arbequina · 2.4 ha |
| Parcel 2 | Surco Baix · Almendro · 1.1 ha |
| Tasks | 5 filas: riego ACTIVE, plagas PENDING, poda DONE, suelo PENDING, abonado ACTIVE |
Códigos ejemplo: SU-0807-01 … SU-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 code | ya 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
- Migración
initaplica User, Parcel, FieldTask + enums. - Seed es idempotente en la práctica (
deleteMany+ create). - No se puede insertar
FieldTasksinparcelIdyfarmerIdválidos (FK). codeúnico impide colisiones exactas (retry no implementado; probabilidad baja con random 100–999).
06-tech-stack.md
Abrir documento06 — Stack tecnológico — SURCO
1. Resumen
| Capa | Tecnología | Versión / nota |
|---|---|---|
| Frontend | Angular (standalone components) | App en apps/web |
| Estilos | Tailwind CSS | Tokens en tailwind.config.js |
| Backend | NestJS | App en apps/api |
| ORM | Prisma | schema + migrate + seed |
| DB | Neon (PostgreSQL serverless) | project old-paper-48739086 |
| Auth | JWT (Passport strategy + guard) | Header Authorization: Bearer |
| Validación API | class-validator + DTOs | Login, create, status |
| Password | bcrypt | cost 10 en seed |
| Diseño | Paper | file 01KZDGF3509TA4WDZTTQJW1V45 |
| Fuentes | Google Fonts Literata + Manrope | styles.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
| Servicio | Puerto | URL local |
|---|---|---|
| API Nest | 3007 | http://localhost:3007 |
| Web Angular | 4200 | http://localhost:4200 |
| Prefijo API | /api | p. ej. POST /api/auth/login |
Variables típicas API (.env):
| Var | Uso |
|---|---|
DATABASE_URL | Neon connection string |
JWT_SECRET | Firma de tokens |
PORT | 3007 (si aplica) |
4. Backend — módulos
| Módulo | Responsabilidad |
|---|---|
AuthModule | login, JWT emit, strategy, guard |
TasksModule | CRUD parcial de FieldTask + stats |
PrismaModule | cliente Prisma global |
Endpoints
| Método | Path | Auth | Rol |
|---|---|---|---|
| POST | /api/auth/login | No | — |
| GET | /api/tasks | JWT | FARMER / TECHNICIAN |
| GET | /api/tasks/stats/summary | JWT | FARMER / TECHNICIAN |
| GET | /api/tasks/:id | JWT | parte de la tarea |
| POST | /api/tasks | JWT | FARMER only |
| PATCH | /api/tasks/:id/status | JWT | parte + reglas status |
CORS: habilitado para dev web en :4200 (según main.ts).
5. Frontend — arquitectura
| Pieza | Detalle |
|---|---|
| Routing | app.routes.ts — 5 rutas + wildcard |
| Estado auth | localStorage token + user en ApiService |
| HTTP | HttpClient vía service |
| UI | Templates inline en componentes standalone |
| Guard | Soft-guard en ngOnInit (redirect si no token) |
Rutas
| Path | Página |
|---|---|
'' | HomePage |
login | LoginPage |
app/tasks | TasksPage |
app/tasks/new | TaskNewPage |
app/tasks/:id | TaskDetailPage |
6. Diseño → código
| Token marca | Uso Tailwind app (aprox.) |
|---|---|
| Bone | bg-bg #F3F0E8 |
| Leaf | primary #3A5A40 |
| Straw | straw #C4A574 |
| Border | border #E0D9CC |
| Display | font-display Literata |
| Sans | font-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)
| Control | Implementación |
|---|---|
| Passwords | bcrypt hash |
| Sesión | JWT bearer |
| Autorización | guard + checks farmer/technician |
| Validación | DTOs 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
npm run apilevanta en 3007 y responde login seed.npm run websirve en 4200 y consume API.- Prisma migrate + seed generan 2 users y 5 tasks.
ng build(o serve) sin errores de compilación.- Rutas de tasks sin JWT → 401.
07-creative-direction.md
Abrir documento07 — Dirección creativa — SURCO
1. Posicionamiento visual
| Eje | Elección |
|---|---|
| Personalidad | Sobria, terrenal, ordenada — “cuaderno de finca”, no app infantil rural |
| Promesa | Claridad del día de campo |
| Tono visual | Bone cálido + leaf profundo + paja (straw) como acento de cultivo |
| Tono verbal | Directo, sin anglicismos innecesarios, sin paternalismo al agricultor |
| Referencias a evitar | Clipart 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.
| Atributo | Sí | No |
|---|---|---|
| Materialidad | Papel hueso, tinta verde hoja | Neón, glassmorphism frío |
| Ritmo | Respiración generosa, cards redondeadas | Densidad de terminal logístico |
| Autoridad | Tipografía display literaria (Literata) | Display sci-fi / mono industrial |
| Acento | Straw en eyebrows y meta | Rojo alarma como color de marca |
3. Moodboard verbal
- Mañana en el bancal, luz lateral, polvo fino.
- Libreta de campo con mancha de tierra en el borde — traducida a UI limpia.
- Verde olivo y hueso de almendra; metal de grifo de riego solo como detalle.
- Silencio operativo: pocos colores, muchas decisiones claras.
4. Fotografía y media
| Uso | Criterio |
|---|---|
| Hero | Parcelas reales / fotorrealistas al atardecer o luz natural |
| Alt text | Descriptivo: “Parcelas agrícolas al atardecer” |
| Archivo case | assets/hero.jpg |
| Archivo app | apps/web/.../assets/hero.jpg (misma pieza) |
| Iconografía | Mí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)
| Rol | Familia | Carácter |
|---|---|---|
| Display / marca / H1–H2 | Literata | Serif humanista, editorial agrícola contemporánea |
| UI / body / labels | Manrope | Sans geométrica legible en móvil de campo |
Jerarquía orientativa:
| Estilo | Tamaño aprox. | Peso |
|---|---|---|
| H1 home | 40–48px | 600 |
| H1 app | 28–32px | 600 |
| Body | 16px | 400–500 |
| Eyebrow | 11–12px | 700, tracking amplio, color straw |
| Caption | 12–13px | 500, ink-muted |
6. Color — dirección de marca
| Nombre | Hex | Rol |
|---|---|---|
| Bone | #F4F0E6 | Fondo página |
| Leaf | #3D5C3A | Primary, CTAs, wordmark acento |
| Leaf deep / ink brand | #1B3A2A | Footer, énfasis |
| Leaf mid | #2A4A32 | Hover strong |
| Straw | #C4A35A | Eyebrows, meta códigos |
| Border | #D9D2C4 | Separadores y cards |
| Surface | #FFFFFF | Cards sobre bone |
| Ink UI | #1A1814 / deep leaf | Texto principal |
| Muted | #6B655C | Secundario |
| Danger | rojo semántico sistema | Solo errores, no marca |
7. Forma y layout
| Elemento | Spec creativa |
|---|---|
| Radios | 16–20px cards; botones pill (rounded-full) |
| Grid home | 2 col hero en desktop; stack mobile |
| Max width | ~72rem (6xl) contenido |
| Header | 64–72px; borde sutil bone/border |
| Sombra | Suave en hero media; cards con borde primero |
| Densidad app | Lista 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
| Proyecto | Clima | SURCO se diferencia por |
|---|---|---|
| TROCHA | Asfalto + ámbar señal | Agro bone/leaf; no paradas flota |
| CORREA | Cream sage terracotta pet | No marketplace; serif Literata agrícola |
| FIRME | Parchment forest legal | Menos “despacho”, más “campo” |
| SENDA | Cuidado social | No indigo; dominio parcela/tarea |
10. Criterios de aceptación creativos
- Home reconoce SURCO en <3 s (wordmark + eslogan + hero agro).
- No se confunde con app de delivery ni pet-care.
- CTAs “Soy agricultor / Soy técnico” alineados al modelo multi-rol.
- Estado de tareas legible por color+texto (no solo color).
- Consistencia Paper ↔ Angular en tokens y tipografía.
08-design-system.md
Abrir documento08 — Design system — SURCO
1. Fundamentos
| Capa | Valor |
|---|---|
| Nombre DS | SURCO UI (L2 vertical slice) |
| Principio | Claridad operativa + calidez de finca |
| Plataformas | Web responsive 360–1280+ |
| Implementación | Tailwind tokens + componentes de página (no lib publicada) |
2. Color tokens
Marca (fuente de verdad del caso)
| Token | Hex | Uso |
|---|---|---|
color.bg.bone | #F4F0E6 | Background app/marketing |
color.surface | #FFFFFF | Cards, header app |
color.leaf | #3D5C3A | Primary |
color.leaf.strong | #2A4A32 | Hover primary |
color.leaf.deep | #1B3A2A | Footer, ink brand |
color.straw | #C4A35A | Eyebrow, acentos |
color.border | #D9D2C4 | Bordes |
color.ink | #1B3A2A / near-black UI | Texto |
color.ink.muted | #6B655C | Secundario |
color.danger | #B91C1C (aprox red-700) | Errores |
color.primary.soft | tinte leaf claro | Badges, chips |
Mapeo Tailwind app
| Clase | Valor 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
| Token | Familia | Fallback |
|---|---|---|
font.display | Literata | Georgia, serif |
font.sans | Manrope | system-ui, sans-serif |
| Estilo | Spec |
|---|---|
| Display xl | Literata 36–48/600, leading tight |
| Title | Literata 28–32/600 |
| Body | Manrope 16/400–500, leading relaxed |
| Label | Manrope 11–12/700 uppercase o tracking wide |
| Button | Manrope 14/600 |
4. Espaciado y radio
| Token | Valor |
|---|---|
| page padding x | 16–24px |
| section y | 40–56px |
| card padding | 16–24px |
| gap grid | 12–16px |
| radius.card | 16–20px (rounded-2xl) |
| radius.pill | 9999px (rounded-full) |
| header height | 64–72px |
5. Componentes
5.1 Botones
| Variante | Estilo | Uso |
|---|---|---|
| Primary | bg primary, text white, pill | CTA principal, submit, + Tarea |
| Secondary | border border, bg surface, pill | “Soy técnico”, secundarios |
| Ghost/text | text muted, hover ink | Entrar, Salir |
Estados: default · hover (strong) · disabled (opacidad) · focus visible ring.
5.2 Badges de estado
| Status | Label | Estilo sugerido |
|---|---|---|
| PENDING | Pendiente | soft primary / muted |
| ACTIVE | Activa | soft + acento straw en meta |
| DONE | Hecha | soft primary |
| CANCELLED | Cancelada | muted / borde dashed opcional |
Regla a11y: no codificar solo con color; siempre texto del label.
5.3 Cards de tarea
Estructura:
- Meta:
code · parcel.name(straw, xs bold) - Título (lg semibold)
- Cultivo · hectáreas
- Vence + nombre contraparte
- 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
| Elemento | Spec |
|---|---|
| Label | sm semibold |
| Input | border, radius xl/2xl, padding cómodo touch |
| Error | text red-700 bajo campo o banner |
| Submit | primary 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
| Nivel | Uso |
|---|---|
| 0 | Fondo bone |
| 1 | Card con border |
| 2 | Hero image shadow-lg |
8. Breakpoints (orientativos Tailwind)
| Nombre | Ancho | Comportamiento |
|---|---|---|
| default | <640 | stack, stats 2 col |
| sm | ≥640 | padding mayor |
| md | ≥768 | home 2 col; stats 4 col |
Touch targets: ≥44px en CTAs móviles (doc 10).
9. Do / Don’t
| Do | Don’t |
|---|---|
| Usar straw solo en meta/eyebrows | Usar straw como fondo masivo de página |
| Mantener pills en CTAs | Botones square material genéricos |
| Literata en títulos de sección | Literata en body largo de form |
| Estados con label textual | Solo verde/rojo sin texto |
| Microcopy de finca | Jerga “sprint”, “ticket backlog” |
10. Criterios de aceptación DS
- Tokens documentados y reflejados en Tailwind.
- Primary contrast aceptable sobre blanco (leaf oscuro).
- Empty y error reutilizan patrones de card/borde.
- Paper B-0 y UI Angular no divergen en familia tipográfica ni clima de color.
09-content-guide.md
Abrir documento09 — Guía de contenido — SURCO
1. Voz y tono
| Dimensión | Definición |
|---|---|
| Voz | Clara, cercana al campo, profesional sin corbata |
| Tono default | Calmado y resolutivo |
| Tono error | Honesto, sin culpar, con siguiente paso |
| Tono empty | Invitador, no vacío existencial |
| Idioma | es-ES; “tú” de cortesía operativa (no “usted” rígido ni “vos”) |
Principios
- Preferir hacer sobre gestionar (“Crear tarea”, no “Gestionar ítems”).
- Usar dominio real: parcela, bancal, riego, poda, muestreo.
- Evitar anglicismos de producto genérico (dashboard, pipeline, owner).
- No infantilizar al agricultor ni romanticizar la ruralidad.
- Demo credentials visibles donde ayuden al portfolio (footer home).
2. Nombres de producto
| Correcto | Incorrecto |
|---|---|
| SURCO (mayúsculas marca) | Surco App Pro |
| El campo, al día. | #1 Farm SaaS |
| Cuaderno de campo / de parcela | ERP agrícola / Farm OS |
| Tarea | Ticket / Issue |
| Parcela / bancal | Plot genérico sin contexto |
| Técnico | Driver / Rider |
3. Microcopy por pantalla
Home
| Elemento | Copy |
|---|---|
| Eyebrow | AGRO · EXPLOTACIÓN FAMILIAR |
| H1 | El campo, al día. |
| Lead | Cuaderno digital de parcelas y tareas. El agricultor planifica; el técnico de campo actualiza estado. Sin papeles mojados en la cabina. |
| CTA primary | Soy agricultor |
| CTA secondary | Soy técnico |
| Header CTA | Abrir cuaderno |
| Pasos | 01 Defines la parcela · 02 Creas la tarea · 03 Se cierra en campo |
| Footer demo | Demo: campo@surco.agro / tecnico@surco.agro · password123 |
Login
| Elemento | Copy sugerido |
|---|---|
| Título | Entrar al cuaderno |
| Correo | |
| Password | Contraseña |
| Submit | Entrar |
| Error | No se pudo iniciar sesión. Revisa correo y contraseña. |
Lista FARMER
| Elemento | Copy |
|---|---|
| Eyebrow | CUADERNO DE CAMPO |
| H1 | Tareas de parcela |
| CTA | + Tarea |
| Empty | No hay tareas todavía. Crear la primera → |
Lista TECHNICIAN
| Elemento | Copy |
|---|---|
| Eyebrow | MIS ASIGNACIONES |
| H1 | Tareas técnicas |
| Empty | No hay tareas todavía. (sin CTA crear) |
Stats labels
TOTAL · ABIERTAS · ACTIVAS · HECHAS
Detalle
| Elemento | Copy |
|---|---|
| Meta | código · parcela |
| Acciones | Marcar activa / Hecha / Cancelada (según UI) |
| Notas vacías | (mostrar vacío o “Sin notas”) |
Nueva tarea
| Campo label | Placeholder orientativo |
|---|---|
| Título | p. ej. Riego gota a gota |
| Parcela | Bancal Nord |
| Cultivo | Olivo arbequina |
| Fecha | selector date/datetime |
| Notas | 2 h sector A |
| Email técnico | tecnico@surco.agro |
| Submit | Crear tarea |
Errores de carga
- “No se pudieron cargar las tareas.”
- “No se pudo guardar la tarea.”
- “Técnico no encontrado.” (API)
Estados (labels)
| API | UI |
|---|---|
| PENDING | Pendiente |
| ACTIVE | Activa |
| DONE | Hecha |
| CANCELLED | Cancelada |
4. Estilo de códigos y datos
| Dato | Formato |
|---|---|
| Código tarea | SU-0807-01 (mono visual no obligatorio) |
| Hectáreas | 2.4 ha (punto decimal OK en demo) |
| Fechas UI | date:'short' Angular (local) |
| Roles badge | FARMER / TECHNICIAN (técnico demo; aceptable en badge) |
5. Mensajes que no deben aparecer
| Evitar | Motivo |
|---|---|
| “Oops! Something went wrong” | Idioma y tono genérico |
| “User not authorized” crudo al farmer | Preferir español claro |
| Marketing de marketplace | Fuera de producto |
| Alarmismo climático | No 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
- Home y app usan el eslogan oficial.
- Empty de farmer incluye camino a crear.
- Credenciales demo coherentes en README, seed y footer.
- Labels de estado en español en toda la UI.
10-accessibility.md
Abrir documento10 — 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 v1 | Fuera / parcial |
|---|---|
| Home, login, lista, detalle, new | Lector de pantalla exhaustivo QA formal |
| Contraste tokens marca | Modo alto contraste OS dedicado |
| Focus visible navegador | Skip links multi-landmark complejos |
| Labels de form | i18n multi-idioma |
3. Contraste
| Par | Intención |
|---|---|
Leaf #3D5C3A sobre blanco | CTAs y badges — verificar ≥4.5:1 en texto small |
| Ink sobre bone | Body text |
| Straw sobre bone | Solo eyebrows/meta; si falla, oscurecer straw o usar leaf |
| White sobre primary | Texto de botón |
| red-700 sobre bone | Errores |
Regla: si un acento straw no alcanza contraste en body, no usarlo para texto < 18px esencial.
4. Teclado y foco
| Control | Comportamiento esperado |
|---|---|
| Enlaces nav | Tab order lógico header → main |
| Botones | Activables con Enter/Espacio |
| Forms | Tab entre campos; submit con Enter |
| Cards tarea | Son <a> — focuseables |
| Salir | button focuseable |
Focus visible: outline del navegador o ring Tailwind; no outline: none global.
5. Semántica y estructura
| Pantalla | Landmarks |
|---|---|
| Home | header, secciones, footer |
| App | header + main |
| Títulos | Un 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
| Requisito | Aplicación |
|---|---|
| Labels visibles | Cada input con label o aria-label |
| Errores en texto | No solo borde rojo |
| Password | type password; no autocomplete off injustificado |
| Fecha | input date/datetime usable con teclado |
7. Color y estado
| Status | Texto obligatorio | Color de apoyo |
|---|---|---|
| Pendiente / Activa / Hecha / Cancelada | Sí (label) | Badge soft |
| Error red | Mensaje textual | color danger |
| Rol | Badge FARMER/TECHNICIAN | soft primary |
8. Touch y móvil de campo
| Spec | Valor |
|---|---|
| Target mínimo CTA | 44×44 px |
| Espacio entre acciones | ≥8 px |
| Lista | Toda la card clicable (área amplia) |
| Zoom | No 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-motionsi se añaden transitions largas.
10. Pruebas recomendadas
| Prueba | Herramienta | Criterio pass |
|---|---|---|
| Contraste | DevTools / axe | 0 críticos en home+login+form |
| Teclado | Manual | Completar login y crear tarea sin ratón |
| SR spot-check | VoiceOver | Labels de form anunciados |
| Zoom 200% | Browser | Sin solapamientos graves |
11. Criterios de aceptación
- Login completible solo con teclado.
- Mensajes de error legibles y en español.
- Estados de tarea con texto, no solo color.
- Hero con alt no vacío.
- No hay
outline: nonesin reemplazo de foco.
11-privacy-security.md
Abrir documento11 — 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
| Dato | Categoría | Finalidad | Sensibilidad |
|---|---|---|---|
| Identificador cuenta | Login | Personal | |
| passwordHash | Credencial | Auth (nunca password en claro) | Crítico |
| name | Identidad | UI personalizada | Personal |
| role | Autorización | Permisos | Operativo |
| parcel name, crop, ha | Datos explotación | Contexto de tarea | Operativo |
| task title, notes, dueAt, status, code | Operativa | Cuaderno | Operativo (notes = texto libre) |
| technicianId / farmerId | Relacional | Asignación | Operativo |
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:
| Tratamiento | Base (orientativa) |
|---|---|
| Cuenta de usuario | Ejecución de contrato / medidas precontractuales |
| Logs técnicos | Interés legítimo seguridad |
| Notas de parcela | Ejecución del servicio |
Demo: datos seed ficticios; no usar emails reales de terceros sin consentimiento.
4. Controles de seguridad
| Control | Implementación v1 |
|---|---|
| Hash de contraseña | bcrypt (seed cost 10) |
| Transporte | HTTPS en deploy; HTTP local dev |
| AuthN | JWT firmado (HS256) con secret de entorno |
| AuthZ | JwtAuthGuard + checks farmer/technician + FARMER-only create |
| Validación entrada | class-validator DTOs |
| Enum status | Solo valores TaskStatus |
| Secretos | .env / Neon URL fuera de git |
| Minimización | Sin campos PII extra; sin GPS ni fotos |
Matriz de autorización (resumen)
| Acción | FARMER | TECHNICIAN |
|---|---|---|
| Login | ✓ | ✓ |
| List own | ✓ | ✓ asignadas |
| Create | ✓ | ✗ 403 |
| Get if party | ✓ | ✓ |
| Patch status if party | ✓ | ✓ (subconjunto ACTIVE/DONE/CANCELLED) |
5. Amenazas y mitigaciones
| Amenaza | Riesgo | Mitigación |
|---|---|---|
| Credenciales demo públicas | Alto en prod real | Solo demo; rotar en prod |
| JWT robado (XSS) | Medio | No guardar datos sensibles extra; CSP futuro; HttpOnly cookie posible evolución |
| IDOR task id | Alto sin checks | get/update validan ownership |
| Enumeración de emails técnico | Bajo | 404 “Técnico no encontrado” |
| Fuerza bruta login | Medio | Rate limit futuro (no v1) |
| SQL injection | Bajo | Prisma parametrizado |
| Logs con passwords | Alto | No loguear body de login |
6. Retención y borrado (modelo / hipótesis de producto)
| Dato | Retención demo | Producción sugerida |
|---|---|---|
| Users seed | Mientras exista DB demo | Mientras cuenta activa |
| Tasks | Hasta delete manual / seed reset | p. ej. 24 meses post-cierre (propuesta) |
| Logs de acceso | N/A v1 | 90 días (propuesta) |
| JWT | Expiración secret-dependent | TTL 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)
- Rotar
JWT_SECRETy forzar re-login. - Reset seed / rotar passwords demo.
- Revisar logs Nest y Neon.
- Notificar usuarios afectados si hubiera PII real.
- Documentar en memory si afecta al caso.
10. Criterios de aceptación seguridad
- Password no se almacena en claro.
/api/taskssin Bearer → 401.- TECHNICIAN POST
/api/tasks→ 403. - TECHNICIAN GET tarea de otro → 403.
.envcon DATABASE_URL no versionado en repo público (revisar.gitignore).- No se loguean contraseñas ni tokens completos en cliente.
12-analytics.md
Abrir documento12 — 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
| Nivel | Métrica | Definición | Fuente |
|---|---|---|---|
| North Star | Tareas DONE / semana (por explotación activa) | Cierres reales de trabajo de campo | DB status + fecha updatedAt (futuro) |
| Activación | % logins FARMER que crean ≥1 tarea en 24 h | Funnel auth → create | eventos + API |
| Asignación | % creates con technicianEmail válido | Delegación | POST body / status ACTIVE |
| Adopción técnico | % técnicos con ≥1 patch status / semana | Engagement campo | PATCH logs |
| Operativa | Mediana horas PENDING→DONE | Velocidad de cierre | timestamps |
| Fiabilidad | Tasa error 5xx / 4xx en tasks | Salud API | logs server |
3. Funnel UX (modelo)
Home view → Login submit → Login success → List view → Create start → Create success → Status DONE
| Paso | Evento sugerido | Props |
|---|---|---|
| home_view | page | path=/ |
| login_submit | form | — |
| login_success | auth | role |
| login_fail | auth | reason=401 |
| tasks_list_view | page | role, total |
| task_create_open | nav | — |
| task_create_submit / success | api | has_technician |
| task_create_fail | api | code |
| task_open | page | id, status |
| task_status_change | api | from, to, role |
| task_status_done | api | subset cuando to=DONE |
| week_active | derived | ≥1 login en 7d (retención) |
4. Stats in-product (implementado)
GET /api/tasks/stats/summary devuelve:
| Campo | Significado |
|---|---|
total | Tareas visibles al rol |
open | PENDING + 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
| Segmento | Clave |
|---|---|
| Rol | FARMER / TECHNICIAN |
| Con/sin técnico | technicianId null vs set |
| Parcela | parcelId / name |
| Antigüedad tarea | dueAt vs now (overdue futuro) |
6. Privacidad en medición
| Regla | Detalle |
|---|---|
| No enviar password ni token a analytics | |
| Preferir id interno opaco a email en eventos | |
| Notas de tarea: no como propiedad de evento | pueden 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)
- Operación semanal: DONE, open, ACTIVE.
- Funnel activación FARMER.
- % con técnico asignado.
- Salud API: latencia p95 login/list/create.
- Empty rate post-login (usuarios sin tareas).
8. Alertas (modelo)
| Condición | Severidad |
|---|---|
| Error rate create > 5% 15m | Alta |
| Login fail spike | Media (posible ataque o seed mal) |
| 0 DONE en 7 días con ACTIVE>0 | Baja 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ótesis | Mé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
- Stats summary coherente con conteo de lista del mismo usuario.
- Documentado el North Star y funnel aunque el vendor no esté cableado.
- Ningún evento planeado incluye contenido libre de
notes. - Hipótesis H1–H3 enlazan a métricas de esta doc.
- Sin stats de mercado falsas en el case.
13-qa-test-plan.md
Abrir documento13 — 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
| Item | Valor |
|---|---|
| API | http://localhost:3007 |
| Web | http://localhost:4200 |
| DB | Neon old-paper-48739086 (o local via DATABASE_URL) |
| Seed | npm run db:seed |
| FARMER | campo@surco.agro / password123 |
| TECHNICIAN | tecnico@surco.agro / password123 |
3. Smoke crítico (bloqueante de cierre)
| # | Caso | Pasos | Esperado |
|---|---|---|---|
| S1 | Login farmer | POST login / UI login | 200 + token; redirect lista |
| S2 | List farmer | GET /api/tasks | ≥1 task seed; solo suyas |
| S3 | Stats | GET stats/summary | total/open/byStatus coherentes |
| S4 | Create | UI new task con parcela y due | Aparece en lista |
| S5 | Assign tech | create con tecnico@… | status ACTIVE; tech la ve |
| S6 | Login tech | login technician | lista asignaciones |
| S7 | Patch DONE | detail → DONE | badge Hecha; stats cambian al reload |
| S8 | Authz create tech | POST tasks con JWT tech | 403 |
| S9 | No token | GET tasks sin Authorization | 401 |
| S10 | Web build/serve | ng serve o build | sin error compile |
Smoke ejecutado / diseñable (2026-08-07)
| Caso | Resultado de diseño |
|---|---|
| Login farmer / tech | accessToken + user.role |
| GET /tasks farmer | seed (5 tareas) |
| GET stats/summary | total/open/byStatus |
| POST /tasks farmer | code SU-* ; ACTIVE si tech |
| PATCH status → DONE | 200 |
| TECH no crea | ForbiddenException 403 |
| ng build production | objetivo OK |
4. Casos funcionales por área
4.1 Auth
| ID | Caso | Resultado |
|---|---|---|
| A1 | Password incorrecto | 401 + mensaje UI |
| A2 | Email mal formado | validación |
| A3 | Logout | token limpio; /app/tasks → login |
| A4 | Token basura | 401 en API |
4.2 Tareas farmer
| ID | Caso | Resultado |
|---|---|---|
| F1 | Lista orden dueAt | más próxima primero |
| F2 | Empty si lista [] | empty + CTA crear |
| F3 | Create sin título | 400 / validación |
| F4 | Create parcela nueva nombre | se crea parcel |
| F5 | Create parcela existente | reutiliza |
| F6 | Técnico email inexistente | 404 controlado |
| F7 | Detalle propio | 200 |
| F8 | Cancelar tarea | status CANCELLED |
4.3 Tareas technician
| ID | Caso | Resultado |
|---|---|---|
| T1 | No ve “+ Tarea” | UI |
| T2 | No crea (POST) | 403 API |
| T3 | Solo asignadas | filtro |
| T4 | DONE en asignada | 200 |
| T5 | Detalle no asignada | 403 |
4.4 UI / contenido
| ID | Caso | Resultado |
|---|---|---|
| U1 | Home hero + 3 pasos | visibles |
| U2 | Labels estado en ES | Pendiente/Activa/Hecha/Cancelada |
| U3 | Error carga lista | mensaje rojo |
| U4 | Responsive 375px | usable 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)
| Pantalla | Checklist |
|---|---|
| Home | Literata H1, leaf CTAs, hero, footer |
| Login | form centrado/legible |
| Lista | stats 4 tiles, cards, badge rol |
| New | campos alineados |
| Detail | acciones estado |
| Empty/Error | patrones 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ímite | Notas |
|---|---|
| Soft guard solo en cliente | API es la autoridad real |
| Código task random | colisión teórica rara |
| Sin refresh token | re-login al expirar |
| Parcela por texto libre | typos crean duplicados lógicos |
No son fallos de cierre si están documentados y el smoke pasa.
14-dev-handoff.md
Abrir documento14 — Handoff a desarrollo — SURCO
1. Fuentes de verdad
| Artefacto | Ubicación |
|---|---|
| Case UX | /Users/cristian/orca/ux-projects/2026-08-07-surco/ |
| Paper | https://app.paper.design/file/01KZDGF3509TA4WDZTTQJW1V45 |
| Código | /Users/cristian/orca/surco-app/ |
| Schema | apps/api/prisma/schema.prisma |
| Seed | apps/api/prisma/seed.ts |
| Tokens UI | apps/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
| UI | Ruta | Archivo |
|---|---|---|
| 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 client | — | apps/web/src/app/core/api.service.ts |
| Routes | — | apps/web/src/app/app.routes.ts |
4. Mapa API → código
| Endpoint | Controller/Service |
|---|---|
POST /api/auth/login | auth.controller.ts / auth.service.ts |
| JWT guard/strategy | jwt-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
- Solo FARMER crea tareas.
- List/get filtrados por rol (no “list all”).
- Parcela se resuelve por nombre + farmerId.
- Técnico válido → status inicial ACTIVE.
- Código
SU-…único. - TECHNICIAN no fuerza estados fuera de su subconjunto permitido en service.
7. Checklist de paridad Paper ↔ app
| Frame | Paridad mínima |
|---|---|
| C-0 Home | hero, eslogan, 3 pasos, CTAs |
| D-0 Login | email/password, error |
| F-0 Tasks | stats + lista + rol |
| G-0 Detail | meta + status actions |
| H-0 New | form completo |
| L/M states | empty + 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)
| Ítem | Nota |
|---|---|
| Guard de rutas Angular formal | Hoy check en página |
| Refresh token | No |
| Tests e2e automatizados | Plan manual en doc 13 |
| Selector parcela | Texto libre |
| i18n | Solo 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.md
Abrir documento15 — 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)
| Capacidad | Estado |
|---|---|
| Home + login JWT | Hecho |
| Lista + stats por rol | Hecho |
| Create FARMER + parcela implícita | Hecho |
| Detail + patch status | Hecho |
| Empty / error | Hecho |
| Seed Inés / Pol | Hecho |
3. Next — endurecer L2 (opcional, misma complejidad)
| Ítem | Valor | Esfuerzo |
|---|---|---|
| Route guards Angular canActivate | Menos flash de contenido | S |
| Filtro UI por estado | Ops más rápida | S |
| Selector de parcelas existentes | Menos typos | M |
| Confirmación al CANCELLED | Menos errores | S |
| Tests e2e Playwright smoke | Regresión | M |
4. Later — L3 posible (nueva decisión de brief)
Solo si un día futuro elige agro L3 (y diversidad lo permite):
| Tema | Por qué sube de nivel |
|---|---|
| Multi-finca / multi-técnico | Tenancy y permisos |
| Adjuntos foto de plaga | Media + storage |
| Offline queue + sync | PWA real de campo |
| Calendario de riego por parcela | Planificación temporal rica |
| Export PDF semana | Reporting |
| Notificaciones (email/push) | Sistema de eventos |
5. No roadmap (explícito)
| Idea | Motivo de exclusión |
|---|---|
| Marketplace de insumos | Producto distinto (CORREA-like) |
| GPS flota cosechadoras | TROCHA-like |
| Cuaderno oficial compliance UE completo | Legal/reg tech pesado |
| Pagos | Fuera de job “cuaderno” |
6. Hitos sugeridos (si hubiera continuidad de producto)
| Hito | Objetivo de métrica |
|---|---|
| M1 Demo portfolio | Smoke 10/10 |
| M2 Pilot 3 fincas | activación create ≥60% logins farmer |
| M3 Campo real | DONE/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
- Diversidad ALS-2 lo permite (no repetir sector/tipo en cooldown).
- Hipótesis H1 validada o refutada con uso real.
- Capacidad de cerrar offline o multi-tenant en una iteración si se declara en alcance.
16-interaction-specs.md
Abrir documento16 — Especificaciones de interacción — SURCO
1. Principios de interacción
| Principio | Detalle |
|---|---|
| Directo | Pocos pasos a create y a DONE |
| Perdonable | Errores con mensaje y reintento manual |
| Rol-consciente | UI no ofrece acciones imposibles |
| Campo-first en móvil | Cards y botones grandes |
| Sin modales innecesarios | Flujos en página (v1) |
2. Home
| Interacción | Comportamiento |
|---|---|
| Hover CTAs | primary-strong / borde |
| Click “Abrir cuaderno” / “Entrar” / roles | → /login |
| Wordmark | → / (reload home) |
| Hero image | no click (decorativa informativa) |
3. Login
| Estado | UI |
|---|---|
| Idle | form vacío o browser autofill |
| Submitting | botón puede deshabilitarse (si implementado) |
| Success | guarda token+user; navigate /app/tasks |
| Error | mensaje bajo form; password no se limpia necesariamente |
| Teclado | Enter envía form |
Timing: feedback de error inmediato al 401; sin toast global obligatorio.
4. Lista de tareas
| Interacción | Comportamiento |
|---|---|
| Load | GET list + GET stats en paralelo |
| Click card | → detalle :id |
| Hover card | border primary/40, cursor pointer |
| + Tarea | solo FARMER → /app/tasks/new |
| Salir | clear storage → login |
| Empty | CTA crear si FARMER |
| Error | texto; usuario puede recargar página |
Stats
Solo lectura; no filtran la lista al click (v1). Futuro: click ACTIVE filtra.
5. Nueva tarea
| Campo | Interacción |
|---|---|
| title | text input focus inicial recomendado |
| parcelName | text; no autocomplete v1 |
| crop | text opcional |
| dueAt | date/datetime-local |
| notes | textarea |
| technicianEmail | email opcional |
| Submit | POST; on success → lista (o detalle) |
| Cancel/back | router a lista |
Validación: bloquear submit vacío en cliente si se desea; servidor es autoridad.
6. Detalle y estados
| Acción | Resultado |
|---|---|
| Ver datos | código, título, parcela, notas, personas |
| Cambiar status | PATCH; actualizar vista local o refetch |
| Transición a DONE | badge “Hecha”; posible disable de acciones redundantes |
| Volver | link a lista |
Feedback
- Success: cambio visible del badge (sin modal).
- Error patch: mensaje “No se pudo actualizar el estado.”
7. Transiciones de estado (UX)
| Desde | Hacia | Quién típico | Copy botón sugerido |
|---|---|---|---|
| PENDING | ACTIVE | Farmer o al asignar | Marcar activa |
| ACTIVE | DONE | Técnico / farmer | Marcar hecha |
| * | CANCELLED | Farmer | Cancelar tarea |
| CANCELLED/DONE | — | — | Solo lectura o reabrir futuro |
8. Responsive
| Breakpoint | Comportamiento |
|---|---|
| <640 | stats 2×2; stack home; header compacto |
| ≥768 | home 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
- Create → visible en lista sin pasos ocultos.
- DONE en ≤3 interacciones desde lista (abrir → acción → hecho).
- Técnico nunca ve CTA create.
- Errores no silenciosos.
17-prototype-map.md
Abrir documento17 — Mapa de prototipo — SURCO
1. Qué es el prototipo
| Capa | Rol |
|---|---|
| Paper | Hi-fi visual estático por bandas §1–§5 |
| Angular app | Prototipo interactivo real (JWT + API + Neon) |
Paper no expone prototipo clicable nativo vía MCP; la app es el prototipo navegable.
2. Enlaces
| Prototipo | URL / path |
|---|---|
| Paper | https://app.paper.design/file/01KZDGF3509TA4WDZTTQJW1V45 |
| App local | http://localhost:4200 |
| API local | http://localhost:3007 |
| Código | /Users/cristian/orca/surco-app/ |
3. Flujos clicables en app
| # | Flujo | Entrada | Salida |
|---|---|---|---|
| 1 | Marketing → login | / CTAs | /login |
| 2 | Login farmer | credenciales Inés | /app/tasks cuaderno |
| 3 | Login tech | credenciales Pol | /app/tasks asignaciones |
| 4 | Create | + Tarea | nueva en lista |
| 5 | Detail status | card | badge actualizado |
| 6 | Logout | Salir | /login |
| 7 | Empty | lista vacía | CTA crear (farmer) |
| 8 | Error | API down | mensaje |
4. Mapa de hotspots (Paper → app)
| Artboard Paper | Hotspot conceptual | Destino app |
|---|---|---|
| C-0 Home | CTAs | /login |
| D-0 Login | Submit | /app/tasks |
| F-0 Tasks | Card | /app/tasks/:id |
| F-0 Tasks | + Tarea | /app/tasks/new |
| H-0 New | Guardar | /app/tasks |
| G-0 Detail | Status | mismo :id |
| J-0 Mobile | mismos destinos | viewport 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)
- Home: eslogan y pasos (20 s).
- Login Inés (20 s).
- Stats + lista (20 s).
- Crear “Revisión de goteros” en Bancal Nord, asignar Pol (40 s).
- Logout → login Pol (20 s).
- Abrir tarea y marcar Hecha (30 s).
- Logout; mencionar Paper y stack (30 s).
7. Limitaciones del prototipo
| Límite | Impacto en demo |
|---|---|
| Sin registro | Solo seed |
| Sin notificaciones | Pol no “recibe push” |
| Sin mapa | Parcela es nombre, no geo |
| Soft client guard | Deep link sin token va a login |
8. Criterios de aceptación del mapa
- Cada pantalla Paper §2–§5 tiene ruta o estado app equivalente.
- Demo de 3 min cubre ambos roles.
- README enlaza Paper + cómo correr app.
18-completeness-audit.md
Abrir documento18 — 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
| Requisito | Estado | Evidencia |
|---|---|---|
| Diversidad sector/tipo/nivel | OK | Agro L2; no marketplace; no GPS fleet |
| Day brief + anti-patrones | OK | docs/00-day-brief.md |
| Paper bandas §1–§5 | OK | file 01KZDGF3509TA4WDZTTQJW1V45 |
| Docs 01–20 | OK | suite en docs/ |
| JWT multi-rol | OK | FARMER / TECHNICIAN |
| API + seed + Neon | OK | old-paper-48739086, port 3007 |
| Web Angular tokens | OK | Literata/Manrope, leaf/straw |
| Smoke login+tasks | OK | plan doc 13 |
| Cierre sin deuda del L2 | OK | roadmap solo L2+/L3 |
| Hipótesis no fake stats | OK | etiquetas en doc 02 |
3. Cobertura funcional
| Feature brief | Implementado | UI | API | Docs |
|---|---|---|---|---|
| Home | Sí | Sí | — | 01,09 |
| Login | Sí | Sí | POST login | 04,06 |
| Lista + stats | Sí | Sí | GET + summary | 05 |
| Create | Sí | Sí | POST | 04 |
| Detail + status | Sí | Sí | GET + PATCH | 04 |
| Empty | Sí | Sí | — | 16 |
| Error red | Sí | Sí | — | 16 |
| Roles demo | Sí | badge | JWT payload | seed |
4. Cobertura Paper
| Banda | Inventario | Notas |
|---|---|---|
| §1 UX | Cover→Datos (2-0…9-0) | doc 00-paper-reference |
| §2 DS+Public | B-0…D-0 | tokens + home + login |
| §3 App | F-0…H-0 | list detail new |
| §4 Mobile | J-0 | tasks mobile |
| §5 States | L-0 M-0 | empty error |
5. Rúbrica de calidad (auto SCORE orientativo)
| Eje | Score 1–5 | Comentario |
|---|---|---|
| Diversidad | 5 | Sector nuevo agro |
| Craft visual | 4–5 | Palette + tipo + hero |
| Densidad UX docs | 5 | Suite completa post-rewrite |
| Completitud código L2 | 4–5 | Vertical slice runnable |
| Authz | 5 | Guard + role checks |
| Verdad investigación | 5 | Sin stats falsas |
6. Huecos aceptados (no regresiones de cierre)
| Hueco | Clasificación |
|---|---|
| Offline | Fuera L2 |
| e2e automatizado | Preferible L2+ |
| Route guards formales | L2+ |
| Compliance cuaderno oficial | Fuera 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 documento19 — 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 | Ítem | Capa |
|---|---|---|
| D01 | Definición producto SURCO | Docs |
| D02 | Day brief diversidad agro L2 | Docs |
| D03 | Personas Inés / Pol | Docs + Paper |
| D04 | JTBD + stories Must | Docs + Paper |
| D05 | IA y flujos | Docs |
| D06 | Modelo User/Parcel/FieldTask | Prisma |
| D07 | Auth JWT login | API + Web |
| D08 | List tasks por rol | API + Web |
| D09 | Stats summary | API + Web |
| D10 | Create task FARMER | API + Web |
| D11 | Detail + patch status | API + Web |
| D12 | Empty + error UI | Web |
| D13 | Home marketing multi-sección | Web |
| D14 | Seed demo + Neon | Data |
| D15 | Design tokens leaf/straw/bone | Web + Paper |
| D16 | Paper referencia §1–§5 | Docs + Paper |
| D17 | Suite docs 00–20 | Docs |
| D18 | README run 3007/4200 | Docs |
2. Backlog L2+ (misma complejidad, mejoras)
| ID | Ítem | Prioridad | Notas |
|---|---|---|---|
| B01 | canActivate guards Angular | P1 | UX auth |
| B02 | Filtros por status en lista | P2 | Query opcional API |
| B03 | Select de parcelas existentes | P1 | reduce duplicados |
| B04 | Confirm dialog cancel | P2 | |
| B05 | Toast de éxito create/status | P3 | |
| B06 | Playwright smoke S1–S10 | P1 | CI |
| B07 | Skeleton loading | P3 | |
| B08 | Orden/secondary sort por status | P3 | |
| B09 | Editar notas post-create | P2 | PATCH parcial |
| B10 | Página 404 amigable | P3 |
3. Backlog L3 (requiere brief nuevo)
| ID | Ítem | Dependencia |
|---|---|---|
| C01 | Multi-explotación | tenancy |
| C02 | Invitaciones de técnicos | email flows |
| C03 | Fotos de campo | storage |
| C04 | Offline PWA queue | service worker |
| C05 | Calendario por parcela | UI densa |
| C06 | Export PDF semanal | reporting |
| C07 | Roles ADMIN | permisos |
| C08 | Mapa parcelas | geo |
4. Explicitamente no-backlog
| Idea | Razón |
|---|---|
| Marketplace insumos | Fuera de SURCO |
| Matching tipo CORREA | Fuera |
| Dispatch GPS tipo TROCHA | Fuera |
| Billing | Fuera job |
5. Orden de ataque recomendado (si hay continuidad)
- B01 guards + B06 e2e
- B03 selector parcelas
- B02 filtros
- Evaluar brief L3 solo tras uso real
6. Trazabilidad
| Origen | Ítems |
|---|---|
| Day brief must-have | D01–D18 |
| Doc 15 roadmap next | B01–B10 |
| Doc 15 later | C01–C08 |
20-implementation.md
Abrir documento20 — Implementación — SURCO
1. Resumen ejecutivo técnico
| Campo | Valor |
|---|---|
| App path | /Users/cristian/orca/surco-app/ |
| API | NestJS · puerto 3007 · prefijo /api |
| Web | Angular standalone · puerto 4200 |
| DB | Neon PostgreSQL · Prisma · old-paper-48739086 |
| Auth | JWT Bearer · roles FARMER | TECHNICIAN |
| Dominio | User, Parcel, FieldTask |
| Fecha | 2026-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
| Rol | Password | |
|---|---|---|
| FARMER | campo@surco.agro | password123 |
| TECHNICIAN | tecnico@surco.agro | password123 |
3. Módulos API implementados
Auth
POST /api/auth/login- Valida email/password; compara bcrypt; emite JWT con
sub, email, role. JwtStrategy+JwtAuthGuardprotegen tasks.
Tasks
| Método | Ruta | Notas |
|---|---|---|
| GET | /api/tasks | filtro por rol |
| GET | /api/tasks/stats/summary | total, open, byStatus |
| GET | /api/tasks/:id | ownership check |
| POST | /api/tasks | solo FARMER; parcela upsert; tech opcional |
| PATCH | /api/tasks/:id/status | ownership + 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ágina | Responsabilidad |
|---|---|
| HomePage | marketing, hero, pasos, footer demo |
| LoginPage | form → ApiService.login → navigate tasks |
| TasksPage | stats + list + empty/error + logout |
| TaskNewPage | form create (farmer) |
| TaskDetailPage | get + patch status |
ApiService centraliza base URL, token storage, métodos HTTP tipados (FieldTask, TaskStats, User).
5. Decisiones de implementación
| Decisión | Razón |
|---|---|
| Puerto API 3007 | Evitar colisión con otros daily apps |
| Soft auth en páginas | Simple L2; API sigue siendo autoridad |
| Parcela por nombre en create | Menos pantallas CRUD en L2 |
| Status ACTIVE al asignar tech | Señal de “en marcha” sin paso extra |
| Templates inline standalone | Velocidad de entrega daily; componentes autocontenidos |
| Stats en endpoint propio | Evita recalcular en cliente y permite evolución |
6. Variables de entorno
| Variable | Servicio | Descripción |
|---|---|---|
DATABASE_URL | API | Neon connection string |
JWT_SECRET | API | Firma tokens |
PORT | API | opcional, 3007 |
Web: URL de API configurable en service (default localhost:3007).
7. Smoke de implementación (mínimo)
- Seed OK en consola (
SURCO seed OK). - Login farmer 200.
- List length ≥ 1.
- Create task 201/200.
- Login tech ve tarea si asignada.
- Patch DONE 200.
- 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:
| Pieza | Opción |
|---|---|
| API | Railway / Fly / Render |
| Web | Netlify / Vercel (static Angular) |
| DB | Neon (ya) |
| CORS | orígenes del front deploy |
10. Criterios de aceptación de implementación
- Comandos del README reproducen el entorno.
- Ambos roles demuestran flujos distintos.
- 403/401 correctos en pruebas de authz.
- UI usa tokens de marca (no default blue Tailwind).
- Case docs enlazan Paper, Neon id, puertos y demos.