Hub

hub-web-viewer

Dashboard

Vista derivada de hub/ (read-only).

Proyectos

46

37 activos · 2p · 2b · 3d

Pendientes abiertos

289

60 alta · 194 media · 35 baja

Clientes

8

7 reales + 1 pseudo

Cerrado reciente

6

resueltos visibles

Próximas fechas (6)

  • 2026-05-31 #206 Integración aprende-ingles ↔ tareas-hijo — marcar lección diaria automáticamente. Cuando el hijo complete una LessonCompletion en aprende-ingles (Postgres en val-soft), una tarea correspondiente en tareas-hijo (Postgres en Fly.io) debería marcarse hecha automáticamente. Mecanismo posible: webhook desde aprende-ingles → endpoint Phoenix en tareas-hijo. Requiere: (a) tareas-hijo tener un endpoint público autenticado para "marcar tarea hecha por slug" (NO existe hoy — Fase 1 #184 está en bloque 1/4); (b) aprende-ingles tener un job/queue que dispatch al completar lección; (c) modelo de mapeo: en tareas-hijo, una tareas_definicion con slug='leccion-ingles-diaria' se vincula. Bloqueado por #184 Fase 1 completa de tareas-hijo (que tenga su esquema LiveView + auth). Cuando se desbloquee, decidir si la integración es push (webhook) o pull (cron en tareas-hijo consulta aprende-ingles). Estimación: chica una vez desbloqueado (1 endpoint + 1 job).
  • 2026-06-01 🔥 #249 Prender ANALISIS_HOOK_CONSUMOS_ENABLED=true (validación automática al subir). Desbloqueado — workers ya listos (#371 cerrado). (Bloque 0)
  • 2026-06-01 #047 #047 Smoke piloto Selene — flujo manual end-to-end de inventarios desde /movimientos-inventario (preparar → entregar → revisar). Probar también MisEntregas y ViajeCompras. Crear OT, asociar inventario, verificar descuento.
  • 2026-06-01 #383 💰 FACTURABLE — Reducir fallos de WhatsApp (33% actual) con fix de calidad de dato en 2 capas: (1) upstream validar teléfono al capturar en POS/alta de cliente (10 dígitos + LADA mexicana válida, se apoya en PhoneNumber/libphonenumber del #197/#368) para atrapar typos antes de gastar envíos; (2) downstream en el webhook marcar números que rebotan con 131026 (flag suave whatsapp_no_disponible, NO opt-out duro porque 131026 a veces es transitorio) + aviso en banda del POS "este número no recibe WhatsApp, verifícalo". Diagnóstico completo en bitácora 2026-05-28. Esperando que Aarón apruebe (Sergio le mostrará el reporte con la columna de causa de falla primero).
  • 2026-06-02 #048 #048 Asignar permisos inventarios_preparar/_entregar/_revisar al resto (18 usuarios en 0) cuando Selene valide el piloto. Capa 1 ON parcial para Selene Ortega (user_id=14, los 3 permisos en 1). Capa 2 (INVENTARIO_VIAJE_LINK) sigue OFF — solo Sergio la activa editando .env.
  • 2026-06-02 #405 Fase 3 del AUDIT (#205): streak con holgura + dashboard /progreso del papá. Streak freeze (1-2 congeladores/semana) + celebración fuerte de los primeros 7 días + récord personal (NO liga/leaderboard). Pantalla /progreso: palabras dominadas vs en repaso, racha, minutos esta semana vs meta, nivel CEFR estimado (Pre-A1/A1, usando datasets CEFR/NGSL locales). Los datos ya están en BD; falta la pantalla que los agregue. Resuelve eje f (métricas). Detalle en AUDIT.md §8.

Ver calendario completo →

🔒 Disparo condicional (5)

  • #393 amadeus Cimientos del bridge. Columna traccar_device_id en vehiculos + mapeo unidad↔device (consultando GET http://201.218.172.10:8082/api/devices); permiso nuevo notificar_retorno en permisos (Nova + modelo); crear token/usuario read-only en Traccar 6.6 (login admin de Sergio); montar scheduler (cron de php artisan schedule:run, hoy inexistente).
  • #394 amadeus Bridge Amadeus↔Traccar. Comando programado que consulta la posición (GET http://201.218.172.10:8082/api/positions?deviceId= en Traccar 6.6) de los vehículos en viaje activo (fecha_cierre IS NULL y destino fuera de Juárez); detecta transición fuera→dentro del bbox de Juárez; dispara evento RetornoDetectadoEvent → listener push+email a quienes tengan notificar_retorno. Mensaje con contexto: "Vehículo U09 (viaje folio X, técnico Y) regresó a Cd. Juárez a las HH:MM." Idempotente (no re-avisar). Alternativa más limpia: notificación web (webhook) de Traccar 6.6 al geofence → endpoint en Amadeus (evita scheduler).
  • #395 amadeus Fase futura: detección por celular del técnico. Para las contadas ocasiones en que el técnico viaja en avión (el vehículo no se mueve, así que Traccar no lo detecta). Geofence ligero vía la PWA de Amadeus (navigator.geolocation), reusando el patrón de captura GPS de #381 (consumos) y del checador #387. Más invasivo (requiere permiso de ubicación / app abierta) — por eso es fase 2, solo el caso avión.
  • #387 amadeus Reloj checador en sitio (geolocalizado) para técnicos de viaje. Checada con captura de coordenada + cotejo contra el GPS del sitio asignado (geofence por radio) para validar que estén físicamente en el lugar de trabajo. Validación suave (bandera, no bloqueo), coherente con la filosofía del milestone. Diseño/ideas en Notas técnicas → Checador geolocalizado (#387). Depende de coords de sitios pobladas (#378).
  • #388 amadeus Ingesta de facturas desde la bandeja de contabilidad + ligado automático a consumos. Leer los correos donde llegan las facturas (CFDI) de los viáticos, parsear el XML, y ligarlas automáticamente al consumo del técnico que corresponde (por monto + fecha + RFC/comercio) para que la contadora ya no cotije a mano al validar/imprimir. Diseño/ideas en Notas técnicas → Ingesta de facturas CFDI (#388).

Se disparan cuando se cumpla la condición (sin fecha fija).

📋 Proyectos con más pendientes abiertos (top 8)

Lista completa →

⏱️ Activos sin tocar (6)

Filtrar todos →

🧑 Por cliente

Cerrado reciente

  • 2026-05-30 #301 hub-web-viewer

    heatmap de actividad en /projects/[slug]

  • 2026-05-30 #WEB-001 hub-web-viewer

    chip 🤖 por pendiente + filtro clickeable en /pendientes

  • 2026-05-29 #051 amadeus

    Smoke notif viaje creado — Sergio marcó como terminada la validación de push + email al crear un viaje real en prod.

  • 2026-05-29 #390 aprende-ingles

    Tanda C de #203: tipo translation_long (traducción de texto con validación en tiempo real). Cierra #203 completo (A+B+C). Muestra 1-2 frases EN INGLÉS (content), el niño escribe la traducción al ESPAÑOL en un textarea; debajo, validación palabra-por-palabra EN VIVO: chips verde (bien) / rojo (revisa). options=null, translation=null, correct_answer=traducción esperada en español. Decisiones con Sergio (AskUserQuestion): umbral aprobar = ≥80% de las palabras, comparación posicional (palabra i vs palabra i), texto = 1-2 frases (8-16 palabras). Algoritmo (idéntico front y back): normaliza (minúsculas, sin puntuación, sin acentos de vocales — los niños los omiten), tokeniza por espacios, compara posicional tolerando dedazos con Levenshtein ≤ min(2, len-1) (más estricto entre más corta la palabra, evita que "un"/"el" matcheen cualquier cosa). Backend usa levenshtein() nativo (por bytes → se trabaja en ASCII tras quitar acentos para que coincida con el JS). Sin migration. Tocado: ApprovePlanRequest (enum + options=null), LessonPlannerService (tipo 7 + ejemplo JSON + instrucción de 1 por lección desde día 3), StudentController::submitExercise (branch de calificación ≥80%), Exercise.vue (helpers levenshtein/tokenize + computeds translationFeedback/translationStats + textarea + panel de chips en vivo + chip "traducir"; submitAnswer ya enruta por el else→studentAnswer). NO tiene fichas de pista (no hay opción que descartar). +8 tests (2 validación ApprovePlanValidationTest + 6 TranslationLongTest: exacta, dedazos, ignora acentos/may/punt, umbral 80% justo=4/5, <80% reprueba, desorden reprueba). Suite 137/137 (era 129). npm run build OK (Exercise.vue 31.13 KB). Pendiente: commit + push + deploy (ver bitácora). Igual que A/B: los planes ya generados no traen translation_long — Sergio genera un plan nuevo como padre para que Leonardo lo vea.

  • 2026-05-29 #205 aprende-ingles

    Auditoría integral + investigación de herramientas externas. Salida en projects/aprende-ingles/AUDIT.md. Cubre los 6 ejes pedidos (UX, calidad IA en los 4 skills, gamification, métricas, gaps vs apps comerciales, herramientas externas). Hallazgo central: la app ya cubre lo de mayor impacto (4 skills, eval pronunciación Azure, Leitner, IA); los gaps reales NO son ligas/leaderboards/vidas (esos serían contraproducentes para un niño solo) sino: (1) sin input visual (imagen por palabra — gap universal en apps de niños), (2) celebración del éxito pobre (sin animación de cierre/sonido/barra que avance con error), (3) repaso solo por intervalo Leitner, no por error/prerrequisito (mastery learning estilo Khan), (4) sin dashboard de progreso longitudinal ni nivel CEFR estimado, (5) sin producción/conversación libre (ya hay ladrillos: IA + voz). Herramientas gratis recomendadas: Datamuse (sin key, 100k/día), Free Dictionary API (IPA+audio, con caché+fallback), datasets CEFR/NGSL locales, Pexels (imágenes), Iconify (iconos). Conjugación API de pago: NO (usar GPT o mlconjug3 local). Plan de 5 fases propuesto en el AUDIT (top: imagen+image_match → celebración+manejo de error → streak con holgura+dashboard /progreso+CEFR → repaso priorizado por error → stretch: micro-historias i+1 + mini-roleplay IA). Pendiente operativo: Sergio decide cuáles fases convertir en pendientes #NNN y con qué fechas (ver entrada de bitácora 2026-05-29). Sin código tocado esta sesión.

  • 2026-05-29 #403 aprende-ingles

    Fase 1 del AUDIT: tipo image_match con apoyo visual (icono Iconify). Ataca el gap #1 (input visual). Decisiones con Sergio (AskUserQuestion): fuente = Iconify (sin API key) — cero bloqueante, iconos limpios que el AUDIT prefiere sobre fotos de stock para un niño; mecánica = opción múltiple (ve el dibujo → elige entre 4 palabras EN); alcance v1 = solo image_match (imagen decorativa en otros tipos = iteración futura). Diseño: content=palabra EN (=correct_answer), options=4 palabras EN, correct_answer∈options; el icono se baja del correct_answer (siempre ilustra la respuesta). Replica el patrón TTS (#202): IconifyImageService (busca en api.iconify.design/search → descarga el SVG → cachea en storage/app/public/icons/{sha1}.svg; null si no hay icono o falla red) + GenerateImageForExerciseJob async (idempotente, se autodescarta si no es image_match) despachado al aprobar el plan, junto al de TTS. Nueva columna image_url (migration). Calificación cae en path genérico (selectedOption===correct_answer) → WordMasteryService SÍ trackea la palabra (refuerza vocab). discard_option aplica. Frontend: render con icono (<img dark:invert> para legibilidad en dark; placeholder 🖼️ si image_url null mientras el job no termina o no hubo icono) + grid 2×2 de opciones (patrón reading). +8 tests (3 validación ApprovePlanValidationTest + 5 ImageMatchTest: califica ok/mal, job guarda image_url con Iconify mockeado, job deja null sin icono, job se autodescarta para no-image_match). Suite 145/145 (era 137). Build OK (Exercise.vue 32.82 KB). Pendiente: commit+push+deploy. Como los demás tipos: la IA solo lo mete en planes nuevos (desde día 1, solo palabras concretas/dibujables) — Sergio genera plan nuevo para que Leonardo lo vea.

Log diario

Ver todo →