Correcciones y Mejoras — Piloto Trento
Correcciones y Mejoras — Piloto Trento
Fuente: Meet del 2026-05-15 — Revisión del workflow de trazabilidad FTL Trace Participantes: Franco Cedillo (arquitecto), Andrés Linares (dev), Dennis Vivas (negocio) Feedback escrito: Yemima (Trento) Deadline piloto: fin de mayo 2026 (~2 semanas desde el meet)
Resumen ejecutivo
- 70% del pliego de Yemima implementado durante la demo (Andrés).
- 15 correcciones pendientes identificadas (resueltas durante o antes del meet omitidas). Ninguna de severidad alta vigente; 2 bloqueantes (B1, B2), 11 medias, 2 bajas.
- 13 mejoras / features nuevas propuestas, evaluadas por impacto/costo.
- Estimación total con asistencia IA (Claude Code): ~6–8 h de desarrollo real (factor observado ~1/5 del estimado humano tradicional de ~35–45 h). Distribuido entre Franco (backend, asistido por IA) y Andrés (app móvil) en las 2 semanas restantes — con holgura amplia.
- Convención de estimaciones: todas las cifras en este documento son tiempos con asistencia IA. Tareas que no son código (comunicaciones, reuniones, esperas físicas) se marcan con (†) y mantienen el tiempo humano original.
Decisiones cerradas en el meet
- Iteración semanal incremental, no megalanzamientos.
- CP1 final: solo 2 campos (
peso_partida+peso_rechazado_partida). Eliminar campos por rollo cuando Trento monte balanza de plataforma. - Etiquetas: rediseño para impresora 3" (antes 4"×2", ahora 3"×2"), estilo "Steam" horizontal — kg + partida grandes, QR pequeño a la derecha, OP visible, GS1 compliant.
- Conformidad CP3 (lavado externo): dropdown 2 opciones (Conforme / No conforme); si "No conforme" → campo texto libre.
- Energía CP5/CP6: 100% IoT, eliminar campo manual de UI.
- Producto multi-cliente: no construir features Trento-específicas sin toggle/config (WTS, Peter Millar, Habitat, San Ramón en pipeline).
- Validación de cantidades: candado backend (no más prendas que el total del lote) — ya implementado.
- Cobertura demo: ~70% del pliego de Yemima implementado.
Parte 1 — Correcciones pendientes (15)
Ordenadas por severidad de mayor a menor. Resueltas durante el meet o antes (C8, C11, C13–C16 del reporte original) omitidas.
blocker Bloqueantes — entran al piloto sí o sí
Nota sobre estimaciones: todas las estimaciones están ajustadas al factor ~1/5 observado al implementar con asistencia IA (Claude Code). Las que no son trabajo de código (comunicaciones, reuniones, esperas físicas) mantienen su tiempo original — marcadas con (†).
| # | Descripción | Módulo | Reportó | Asignado a | Estimación | Status |
|---|---|---|---|---|---|---|
| B1 | QLever (CP3) — sin integración, sin datos. Responder a Yemima aclarando que es dependencia externa. Definir qué data de QLever queremos a futuro (ver "Pendientes con Trento" abajo). Mientras: aceptar entrada manual en CP3. | Backend CP3 + comunicación Trento | Andrés / Franco | — | 1 h (†, comunicación) + decisión scope | Todo |
| B2 | Etiqueta para impresora 3" — rediseño completo (antes 4"×2", ahora 3"×2"). Estilo Steam horizontal. GS1 compliant. Bloqueado hasta que lleguen impresoras definitivas. | App móvil — impresión | Dennis | Andrés | 50 min – 1.2 h | Todo |
medium Severidad media
Nota: No hay items de severidad alta pendientes. Los problemas de OCR Gemini reportados (M10/M11) solo se reproducen en ambiente de prueba (fotos de balanzas); con la cámara directamente frente a una balanza real el algoritmo no falla. Por eso se reclasifican como media.
| # | Descripción | Módulo | Reportó | Asignado a | Estimación | Status |
|---|---|---|---|---|---|---|
| M1 | Header no fijo durante scroll. Hacer fixed o colapsable, fusionando header "FTL Trace" al colapsar. | App móvil — UI global | Franco | Andrés | 12–25 min | Todo |
| M2 | Identificación de CP en pantalla. En screenshots del cliente no se ve en qué CP estaba. Mostrar CP activo de forma persistente. | App móvil — todos los CPs | Franco | Andrés | 12 min (atado a E2 abajo) | Todo |
| M3 | Renombrar campo "peso total recibido en kilos" → peso total de la partida recibido en kilos (ambigüedad). |
Backend + UI CP1 | Dennis | Franco | 6 min | Done |
| M4 | Eliminar campos por rollo en CP1 (rollo_defectuoso, peso por rollo) — desplegar cuando Trento confirme balanza. Backend dinámico para Andrés. |
Backend CP1 | Dennis | Franco | 12–25 min (†, desbloqueo depende de Trento) | Todo |
| M5 | CP2 — texto "peso de la tela consumida" ambiguo. Decisión confirmada: es valor real medido en balanza durante el cierre del CP en la app móvil, no viene del ERP. Label aclarado en backend para evitar confusión futura. | Backend CP2 | Yemima | Franco | 6 min | Done |
| M6 | Dropdown conformidad CP3 (lavado externo). Reemplazar texto libre por dropdown 2 opciones; si "No conforme" → campo texto. Backend ya expone enum: [Conforme, No conforme] + atributo declarativo requerido_si en observaciones_calidad; enum interno recortado de 3→2 valores. Falta integración en app móvil. |
Backend + App móvil CP3 | Yemima | Franco (backend) / Andrés (móvil) | 25 min | Done backend / Todo móvil |
| M7 | CP4 — bolsas vs rumas. Trento pide "rumas". Decidir: reemplazar, coexistir, o configurable por cliente. Impacta generación GS1. Recomendación: configurable vía admin panel (E7) pero por ahora reemplazo simple. | Backend + App CP4 | Yemima / Andrés | Franco (backend) / Andrés (móvil) | 25–35 min (config básica) o 1.2–1.5 h (admin panel) | Todo |
| M8 | Eliminar campo "energía habilitado" / energía manual de UI en CP5/CP6 (todo IoT). | Backend + App CP5/CP6 | Dennis | Franco | 12 min | Done (backend; móvil deja de pintarlo automáticamente) |
| M9 | Tipo de dato number_scan en backend — permitir a backend marcar qué campos numéricos son escaneables (mostrar icono cámara). Habilita escenarios sin balanza electrónica (avíos, otras fábricas). Backend marca 10 campos de balanza (peso en kg) con tipo: "number_scan". App móvil debe distinguirlo de "number" para mostrar/ocultar cámara. Retrocompat: si la app aún no lo soporta, lo trata como "number". |
Backend (modelo campos dinámicos) | Andrés | Franco (backend) / Andrés (móvil) | 6 min (backend) + 12–25 min (móvil) | Done backend / Todo móvil |
| M10 | Gemini OCR lee mal balanza con fotos de prueba — reflejos + lee números decorativos (no del display 7 segmentos). Solo se reproduce con fotos de prueba; con cámara directa frente a balanza real no falla. Mitigación: máscara visual + mejora de prompt (ver E4/E5). | App móvil — visión CP1 | Andrés | Andrés | 12–25 min | Todo |
| M11 | Gemini pareo erróneo en fotos de prueba — lee 28.5 / 2.65 y lo asigna al campo equivocado (peso_rechazado). Mismo contexto que M10 — solo ambiente de prueba. Validar pareo lectura→campo destino. |
App móvil — CP1 OCR | Andrés / Franco | Andrés | 12–25 min (atado a M10) | Todo |
low Severidad baja
| # | Descripción | Módulo | Reportó | Asignado a | Estimación | Status |
|---|---|---|---|---|---|---|
| L1 | Botón "SC" arriba duplica botón "perfil" abajo. Ocultar/reusar espacio. | App móvil — header | Franco | Andrés | 6 min | Todo |
| L2 | Código de barras COD 128 se ve "feo" / desbordado — interfaz no preparada para anchos grandes. Aceptable para piloto si Data Matrix queda por defecto. | App móvil — render | Andrés | Andrés | 12 min o postergar | Todo |
Parte 2 — Mejoras / Features nuevas (13)
Evaluación de impacto/costo. Costo en tiempo real con asistencia IA (factor ~1/5 sobre la convención humana 1 SP ≈ 1 h). Items con (†) son no-código y mantienen tiempo humano.
| # | Mejora | Módulo | Asignado a | Impacto piloto | Costo | Decisión sugerida | Status |
|---|---|---|---|---|---|---|---|
| E1 | Feedback in-app — botón que envía sugerencia + screenshot + CP activo + último payload. | App + Backend (endpoint nuevo) | Franco (backend) / Andrés (móvil) | Alto — recoger feedback estructurado de Trento y futuros pilotos. | 50 min – 1.2 h | Entra al piloto — multiplica la calidad del feedback recibido. | Todo |
| E2 | Cinta/banner inferior persistente con CP activo (verde, alineado con header). | App móvil UX global | Andrés | Alto — soluciona M2 de forma estructural. | 25 min | Entra al piloto (atar con M2). | Todo |
| E3 | Tipo number_scan flexible (= corrección M9). |
Backend | Franco | Alto — multi-cliente sin recompilar. | 6 min | Entra al piloto (ya está como M9). | Done (backend) |
| E4 | Máscara visual / overlay sobre foto de balanza para guiar a Gemini al display 7 segmentos. | App móvil — visión | Andrés | Medio — sube precisión OCR sin reentrenar (en ambiente de prueba). | 6–12 min | Entra al piloto (quick win, resuelve M10). | Todo |
| E5 | Mejora prompt Gemini — instruir lectura exclusiva de paneles 7 segmentos. | Backend / config IA | Franco | Medio — refuerza E4. | 6 min | Entra al piloto (quick win, junto a E4). | Todo |
| E6 | Web Checkpoint — herramienta interna para probar flujo OCR sin APK / sin balanza física. | Backend tooling | Franco | Medio — acelera debug del equipo. | 50 min – 1.2 h | Postergar post-piloto — productividad interna, no afecta cliente. | Todo |
| E7 | Admin panel — config nombres de campos por cliente (bolsas↔rumas, traducciones por cliente). | Backend + Admin panel | Franco | Alto a futuro — habilita multi-cliente (Peter Millar, Habitat, San Ramón). | 2.5–4 h | Postergar post-piloto — versión mínima vía M7 por ahora. | Todo |
| E8 | Lectura IoT energía al cierre del lote con timestamps continuos. | IoT + Backend | Franco | Alto para PEF — quita carga manual al operario. | 1.5–3 h | Estado actual: base lista al 2026-04-27 (PRs #361 + #347). Continuar tras correcciones críticas. | Todo (parcial) |
| E9 | Rediseño etiqueta Steam-style (= corrección B2). | App móvil — impresión | Andrés | Bloqueante piloto. | 50 min – 1.2 h | Entra al piloto (ya está como B2). | Todo |
| E10 | Data Matrix + alternar con código de barras desde settings locales. | App móvil — settings | Andrés | Medio — adapta a clientes con código barras industrial. | 25–35 min | Entra al piloto (Data Matrix por defecto ya acordado). | Todo |
| E11 | Validación configurable de rangos por campo numérico (ej. kilos entre 5 y 10). | Backend (config por cliente) | Franco | Medio — robustez de datos. | 1–1.5 h | Postergar post-piloto — Franco lo marcó como futuro. | Todo |
| E12 | Pipeline Jenkins APK + levantar app local para test rápido. | DevOps | — | Bajo-medio — productividad interna. | 1–2 h | Postergar post-piloto — no afecta cliente. | Todo |
| E13 | Roadmap producto multi-cliente (WTS, Peter Millar, Habitat, San Ramón) — separar Trento-específico de genérico textil. | Estrategia producto | Dennis / Franco | Alto estratégico — no es trabajo de código. | 2 h (†, reunión) | Agendar antes del cierre del piloto — input para E7/E11. | Todo |
Avance de implementación (Done)
Cambios ya aplicados al backend en una única pasada sobre apps/backend/src/api/routers/checkpoints/cp_field_defs.py y archivos relacionados:
M3 — Label CP1 peso_total_recibido_kg
cp_field_defs.pyCP1: label"Peso total recibido"→"Peso total de la partida recibido".- Columna DB (
peso_total_recibido_kg) sin cambios — solo el texto expuesto a UI.
M6 backend — Dropdown conformidad CP3
cp_field_defs.pyCP3: campoconformidad_visualcambia detipo: "string"libre →tipo: "enum"conopciones: ["Conforme", "No conforme"].- Nuevo atributo declarativo
requerido_sienobservaciones_calidad:json { "campo": "observaciones_calidad", "tipo": "string", "requerido_si": {"conformidad_visual": "No conforme"} }La app móvil debe leer este atributo y exigir el campo dinámicamente cuando se cumpla la condición. Esto generaliza la lógica de "campos condicionales" para futuros checkpoints sin código nuevo en backend. - Enum
ConformidadVisualEnumrecortado de 3→2 valores. Se eliminóconforme_con_obs = "Conforme con observaciones"desrc/domain/models/cp3_session.py. - Migración alembic 059 (
p2q59e059_059_cortar_conformidad_visual.py) —UPDATEsobrecp3_sessionylavadospara mapear registros legacy"Conforme con observaciones"→"Conforme". Las observaciones permanecen intactas enobservaciones_calidad. - Tests actualizados:
test_cp3_session.pyvalida 2 valores en lugar de 3.
M8 — Eliminar campo energía manual CP5
cp_field_defs.pyCP5: eliminada entrada visibleenergia_habilitado_kwh.- Columna DB conservada (la rellenará la integración IoT — ver E8).
- CP6 no requirió cambios:
energia_costura_kwhya estaba marcadointernal: True(no visible en app móvil).
M5 — Clarificar label CP2 peso_tela_consumida_kg
- Decisión confirmada: el dato es medido en balanza al cierre del CP en la app móvil, no se jala del ERP.
- Label actualizado a
"Peso tela consumida (medido en balanza al cierre del CP)"para evitar confusión futura. - Punto 3 de "Pendientes con Trento" eliminado — ya no requiere decisión externa.
M9 — Tipo number_scan (backend)
- Nuevo
tipo: "number_scan"aplicado a 10 campos numéricos medidos en balanza: - CP1:
peso_total_recibido_kg,peso_rechazado_kg - CP2:
peso_tela_consumida_kg,peso_panos_cortados_kg,peso_merma_kg - CP3:
peso_retorno_kg - CP4:
peso_merma_corte_piezas_kg - CP5:
merma_avios_kg - CP9:
peso_total_kg,peso_neto_kg - Contrato documentado en docstring de
cp_field_defs.py. La app móvil cuando esté actualizada distingue: tipo: "number"→ input numérico sin cámaratipo: "number_scan"→ input numérico + botón cámara OCR- Retrocompat: la app móvil actual puede tratar
"number_scan"como"number"sin romperse; falta cambio en móvil para activar el ícono cámara. - Campos NO marcados (intencionalmente): conteos (rollos, piezas, bultos, cajas), porcentajes (%), kWh (energía IoT), unidades de operaciones.
Verificación
- 32 tests CP1/CP3/CP5 + tests
cp_field_defspasan (✓). - Diff total: 1 archivo backend modificado (
cp_field_defs.py), 1 modelo (cp3_session.py), 1 test (test_cp3_session.py), 1 migración alembic (059).
Parte 3 — Pendientes con Trento / Yemima (para correo de cierre)
Decisiones que faltan resolver con el cliente. Andrés y Dennis acordaron enviar correo.
-
QLever (CP3) — ¿qué data queremos integrar? Confirmar campos críticos: - Receta de lavado (suavizante, enzimas, temperatura, tiempo) - Peso entrada / peso salida - Batch ID o número de proceso QLever - Fecha/hora de inicio y fin - Operario / responsable - Resultado conformidad (atar con M6) - Sugerencia FTL: pedir export Excel/CSV con esos campos como solución temporal mientras se evalúa integración API.
-
CP4 bolsas vs rumas — confirmar si Trento acepta "ruma" como reemplazo global o requiere coexistencia con otros clientes.
-
~~CP2 peso de tela consumida~~ — Resuelto: dato es manual desde balanza en app móvil, no ERP. Ver M5 en sección "Avance de implementación".
-
Fecha real de llegada de balanza de plataforma — determina cuándo desplegar M4.
-
Fecha real de llegada de impresoras 3" — determina cuándo desplegar B2.
Parte 4 — Sprint propuesto para las 2 semanas del piloto
Estimaciones con asistencia IA (factor ~1/5). Items (†) son no-código (comunicación, espera física) y mantienen tiempo humano.
Sprint 1 (semana 18-22 mayo) — Quick wins + bloqueantes blandos
- ✅ M3 (renombrar campo) — 6 min · Franco — Done
- ✅ M5 (texto CP2) — 6 min · Franco — Done
- ✅ M6 backend (dropdown conformidad CP3) — 25 min · Franco — Done
- ✅ M8 (eliminar energía manual) — 12 min · Franco — Done
- ✅ M9 backend (tipo
number_scan) — 6 min · Franco — Done - ⏳ L1 (botón duplicado) — 6 min · Andrés
- ⏳ E4 + E5 (máscara OCR + prompt) — 12–18 min · Franco + Andrés
- ⏳ M10 + M11 (Gemini OCR fix) — 25–50 min · Andrés
- ⏳ E2 + M2 (cinta CP activo) — 25–35 min · Andrés
- ⏳ M6 móvil (UI dropdown) — 12–25 min · Andrés
- ⏳ B1 (correo QLever) — 1 h (†) · Andrés / Dennis
Total semana 1 con IA: ~3–4 h (vs ~13 h humano).
Sprint 2 (semana 25-29 mayo) — Estructurales del piloto
- M9 móvil (icono cámara según
number_scan) — 12–25 min · Andrés - M1 (header fijo) — 12–25 min · Andrés
- M7 (bolsas → rumas, versión básica) — 25–35 min · Franco + Andrés
- E1 (feedback in-app) — 50 min – 1.2 h · Andrés + Franco
- E10 (Data Matrix toggle) — 25–35 min · Andrés
- M4 (eliminar campos por rollo) — atado (†) a llegada de balanza · Franco
- B2 (etiqueta 3") — atado (†) a llegada de impresora · Andrés
- L2 (COD 128) — 12 min o postergar
Total semana 2 con IA: ~2.5–4 h (vs ~18 h humano) + dependencias externas.
Total piloto con IA: ~6–8 h código + dependencias externas (†). Holgura amplia para iteración con Trento durante el piloto.
Comparativa estimación humana vs realidad con IA: el equipo estimó originalmente ~41 h de desarrollo. Las tareas backend ya implementadas en este sprint (M3, M5, M6 backend, M8, M9 backend) confirman el factor ~1/5, dejando holgura significativa para iteración, debugging en campo, feedback rápido del piloto.
Parte 5 — Verificación end-to-end
Por cada corrección crítica:
- B1 (QLever): confirmar email enviado a Yemima; respuesta documentada en
docs/. - B2 (etiqueta 3"): imprimir muestra física, validar lectura QR + barcode con scanner real.
- M10+M11+E4+E5 (OCR): probar Gemini con 10 fotos reales de balanza Trento, medir precisión antes/después.
- M6 (dropdown CP3): flujo end-to-end de operario marcando "No conforme" + texto, verificar persistencia en backend y visibilidad en dashboard.
- M9 / E3 (
number_scan): verificar que camponumber_scan: falseno muestre cámara en app, ytruesí. - E1 (feedback in-app): Dennis o piloto Trento envían un feedback de prueba; llega con screenshot + CP + payload al endpoint.
Notas operativas (no-código)
- Coordinar reunión Andrés + Rosa María.
- Reset password Kenneth (Rosa María).
- Cargar datos de prueba en Dolibarr (equipo Fintech Lab).
- Considerar abrir un OpenSpec change si el bloque E7 (admin panel multi-cliente) escala — alcance grande, merece especificación formal.