Hub

hub-web-viewer

Dashboard

Vista derivada de hub/ (read-only).

Proyectos

46

37 activos · 2p · 2b · 3d

Pendientes abiertos

281

58 alta · 190 media · 33 baja

Clientes

8

7 reales + 1 pseudo

Cerrado reciente

6

resueltos visibles

Próximas fechas (6)

  • 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 #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 #ING-001 Después (no bloqueante): rate limit del lado app en generatePlan (padre puede tirar N llamadas a OpenAI con clicks repetidos) + retry/backoff en LessonPlannerService.
  • 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-01 #409 Definir el proceso repetible para agregar más clientes WG road-warrior con acceso a las mismas redes. Base ya escrita (runbook en electrosystems/servers/wireguard/README.md + memoria reference_es_wireguard_roadwarrior). Pendiente: decidir si conviene un script/plantilla (genera llaves + arma el .conf cliente con el AllowedIPs canónico + comando server listo), convención de IPs .16+, y dejar el bloque AllowedIPs canónico en un solo lugar reutilizable. Toca infra ES (VM wireguard).

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-31 #406 aprende-ingles

    Fase 4 del AUDIT: repaso priorizado por error real + anclaje de vocabulario CEFR/NGSL. Mejora el motor IA sin rehacerlo. Parte B (anclaje, opción robusta elegida por Sergio): dataset local real CEFR-J Vocabulary Profile + NGSL fusionado (database/data/vocabulary.csv, 6864 palabras con nivel CEFR mín + banda de frecuencia; pool preferente A1/A2 de alta frecuencia = 1678). Nueva tabla vocabulary (migration) + VocabularySeeder (idempotente, en DatabaseSeeder) + modelo Vocabulary + VocabularyService (cefrLevel/isA1A2/frequencyRank/preferredPool/classify/levelsFor). Parte A (mastery learning): accessor box/is_mastered/is_struggling en WordMastery (¡arregla bug de Fase 3, ver abajo!) + WordMasteryService::masterySnapshot() (dominadas box≥4 / prerrequisitos flojos box≤1). El LessonPlannerService ahora recibe student_id (threadeado por Planner.vue→controller→PlanGeneration.inputsGeneratePlanJob), inyecta al prompt: anclaje A1/A2 + pool preferente + palabras dominadas (no re-enseñar, usar como andamiaje) + consolidación de prerrequisitos en días 2-3 antes de subir dificultad; audita (loguea, no rechaza) el vocab generado fuera de A1/A2. Bug de Fase 3 encontrado y arreglado: progreso() hacía where('box',5) sobre la colección pero box no era columna ni accessor → masteredCount siempre 0 y CEFR clavado en Pre-A1. El accessor lo arregla; además la estimación CEFR ahora se deriva del nivel real de las palabras consolidadas (caja≥4) vía VocabularyService, no de un conteo total, con desglose A1/A2 mostrado en Progreso.vue. +17 tests (VocabularyService, MasterySnapshot/box, PlannerMasteryAnchoring, ProgresoCefr). Suite 162/162 (era 145). Build OK (Progreso + Planner). Datos fuente abiertos (openlanguageprofiles/olp-en-cefrj + NGSL). Pendiente: commit + push + deploy (Sergio autoriza el commit; push pre-autorizado dispara GHA→val-soft). Verificar con Leonardo cuando genere un plan nuevo.

  • 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.

Log diario

Ver todo →