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
🔴 Top prioridades (8 high · active)
-
electro-ia
active high electrosystemsActualizado 2026-05-29
-
es-antenas-new
active high electrosystemsActualizado 2026-05-29
-
machine-parity
active high personalActualizado 2026-05-29
-
orion-decommission
active high electrosystemsActualizado 2026-05-29
-
poseidon-root-triage
active high electrosystemsActualizado 2026-05-29
-
amadeus-consumos-milestone
active high electrosystemsActualizado 2026-05-28
-
telcel-capellina-lajunta
active high telcelActualizado 2026-05-28
-
monitoreo-collector
🥶active high electrosystemsActualizado 2026-05-12
📊 Actividad reciente
⏰ 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
LessonCompletionen 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, unatareas_definicionconslug='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énMisEntregasyViajeCompras. 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/_revisaral resto (18 usuarios en 0) cuando Selene valide el piloto. Capa 1 ON parcial para Selene Ortega (user_id=14, los 3 permisos en1). 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
/progresodel 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 enAUDIT.md§8.
🔒 Disparo condicional (5)
- #393 amadeus Cimientos del bridge. Columna
traccar_device_idenvehiculos+ mapeo unidad↔device (consultandoGET http://201.218.172.10:8082/api/devices); permiso nuevonotificar_retornoenpermisos(Nova + modelo); crear token/usuario read-only en Traccar 6.6 (login admin de Sergio); montar scheduler (cron dephp 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 NULLy destino fuera de Juárez); detecta transición fuera→dentro del bbox de Juárez; dispara eventoRetornoDetectadoEvent→ listener push+email a quienes tengannotificar_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 →- 38
amadeus
electrosystems · active · medium
- 30
amadeus-sprints
electrosystems · active · medium
- 23
projects-hub
electrosystems · paused · low
- 23
vpn-clientes
electrosystems · active · medium
- 19
backup-system
electrosystems · active · medium
- 15
electro-ia
electrosystems · active · high
- 13
wireguard-jrz-elp
electrosystems · active · medium
- 12
holbox
holbox · active · medium
⏱️ Activos sin tocar (6)
Filtrar todos →🧑 Por cliente
✅ Cerrado reciente
-
heatmap de actividad en /projects/[slug]
-
chip 🤖 por pendiente + filtro clickeable en /pendientes
-
Smoke notif viaje creado — Sergio marcó como terminada la validación de push + email al crear un viaje real en prod.
-
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 usalevenshtein()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 + computedstranslationFeedback/translationStats+ textarea + panel de chips en vivo + chip "traducir";submitAnswerya enruta por elelse→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 buildOK (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. -
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#NNNy con qué fechas (ver entrada de bitácora 2026-05-29). Sin código tocado esta sesión. -
Fase 1 del AUDIT: tipo
image_matchcon 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 delcorrect_answer(siempre ilustra la respuesta). Replica el patrón TTS (#202):IconifyImageService(busca enapi.iconify.design/search→ descarga el SVG → cachea enstorage/app/public/icons/{sha1}.svg; null si no hay icono o falla red) +GenerateImageForExerciseJobasync (idempotente, se autodescarta si no es image_match) despachado al aprobar el plan, junto al de TTS. Nueva columnaimage_url(migration). Calificación cae en path genérico (selectedOption===correct_answer) → WordMasteryService SÍ trackea la palabra (refuerza vocab).discard_optionaplica. 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 →- 2026-05-29 viernes
86dd2fa (viewer) — /pendientes derivado de projects/, fin de PENDIENTES.md como input. · 79d92da (hub) — eliminar PENDIENTES.md; fuente única en projects/. · dc6875a (hub) — #399 active+high (40 bullets).
- 2026-05-28 jueves
#396 — Sergio aclaró que hay un segundo host de VMs sin documentar (SSH alias ares, 192.168.3.2). Lo perfilé completo read-only: 2º hypervisor KVM (Ubuntu 20.04, dual Xeon X5675, 62 GiB, 3.6 TB), corre 5 VMs incl. el Traccar vivo. Docume…
- 2026-05-27 miércoles
holbox #197 — soporte WhatsApp internacional con libphonenumber-for-php. Commit 35ac39f ya estaba mergeado de sesión previa; cerrado administrativamente y restada bandera viva para LADA 915 (capturada como #368). · holbox #161 Entrega 1 …
- 2026-05-26 martes
1. Verificación de estado real vs el plan del 22. Inventario silencioso desde la última sesión: gh 2.92.0 ya estaba instalado (sin saber cuándo); wireguard-tools y wrappers Docker seguían faltando; aprende-ingles, es-antenas-new, tareas-…
- 2026-05-23 sábado
Sergio reportó dos síntomas: 63 dispositivos sin datos del colector + portal con error 500. Las causas resultaron ser dos bugs separados con efectos amplificadores: · 1. Endpoint /metrics colgaba PHP-FPM — Dispositivo::with('ultima_lectu…
- 2026-05-22 viernes
Al arrancar la sesión, el hub estaba git-corrupto. git status reventaba con error: loose object e4dc4a88... is corrupt. Diagnóstico con git fsck: 4 objetos loose vacíos todos con timestamp May 22 02:18 — clásico de WSL2 cerrado de golpe …