diff --git a/docs/plan-onboarding-comandos.md b/docs/plan-onboarding-comandos.md new file mode 100644 index 0000000..3e069f7 --- /dev/null +++ b/docs/plan-onboarding-comandos.md @@ -0,0 +1,305 @@ +# Plan por fases: Onboarding por DM y simplificación de comandos + +Este documento define un plan incremental para: +- Introducir onboarding por DM no intrusivo (máx. 2 DMs por usuario, espaciados 14 días). +- Simplificar los comandos de visualización. +- Ajustar el material de ayuda. +- Añadir métricas y banderas de configuración. +- Mantener "cero mensajes en grupos" (solo reacciones). + +Se prioriza minimizar migraciones y cambios de superficie, aprovechando infraestructura existente (ResponseQueue, GroupSync, Identity/Contacts, Help v2). + +Estado actual relevante (resumen) +- El bot ya responde por DM a acciones de tareas y evita escribir en grupos (salvo reacciones). +- Listados de tareas: “ver grupo/mis/todas/sin”. +- Help v2 en src/services/messages/help.ts (copys). +- Envío de mensajes mediante ResponseQueue con metadata JSON (ya se usa para reacciones). +- GroupSync mantiene una cache y utilidades de membresía y snapshot frescas. +- No hay aún estado explícito de onboarding por usuario. + +Principios +- Nunca escribimos mensajes en grupos (solo reacciones). +- Onboarding solo se dispara cuando se crea una tarea en un grupo (evento con “excusa” clara). +- Onboarding por usuario: máx. 2 DMs, separados al menos 14 días; si no interactúa, no insistimos más. +- Alias de comandos más cortos y claros para fomentar uso por DM. + +--- + +## Fase 0 — Auditoría y decisiones de compatibilidad + +Objetivos +- Acordar defaults y compatibilidad de comandos. +- Confirmar feature flags y límites. +- Asegurar que no afectaremos flujos sensibles. + +Archivos a consultar +- src/services/command.ts +- src/services/messages/help.ts +- src/utils/whatsapp.ts +- src/services/allowed-groups.ts +- tests relacionados con comandos de listado (no incluidos aquí) + +Overview de cambios (sin código) +- Definir que en DM “/t ver” (sin argumentos) se comporte como “todas”. +- Mantener compatibilidad con “/t ayuda”, pero comunicar “/t info” como alias preferido. +- Aceptar “/t mias” y “/t todas” como atajos (alias de “ver mis” y “ver todas”). +- En contexto de grupo, cualquier intento de “ver …” no debe listar en el grupo; se responderá por DM (mensaje breve de transición). +- Flags/env de onboarding (ver Fase 4). + +Criterios de aceptación +- Decisión documentada: “/t ver” en DM => “todas”. +- Alias permitidos y comunicados en help. +- Confirmación de “cero mensajes en grupo”. + +--- + +## Fase 1 — Alias y routing de comandos (sin onboarding aún) + +Objetivos +- Añadir y mapear alias “info” → “ayuda”; “mias” → “ver mis”; “todas” → “ver todas”. +- Cambiar default de “/t ver” (en DM) a “todas”. +- En grupo, redirigir listados a DM con mensaje corto de transición (sin listar en el grupo). + +Archivos a modificar +- src/services/command.ts +- src/services/messages/help.ts (copys actualizados con alias) +- src/utils/icons.ts y src/utils/formatting.ts (solo si se requiere algún símbolo/estilo nuevo) + +Overview de cambios +- Extender ACTION_ALIASES y/o routing para nuevas acciones y scopes. +- Detectar contexto de grupo y bloquear listados en el grupo (enviar por DM un mensaje de transición: “No respondo en grupos. Tus tareas: /t mias · Todas: /t todas · Info: /t info · Web: /t web”). +- Help v2: mostrar “/t mias”, “/t todas”, “/t info”; retirar “ver grupo” de la guía básica y sugerir web para ver todo el grupo. + +Impacto en tests +- Actualizar tests que esperen “/t ver” => “mis” en DM. +- Añadir tests de alias (“mias”, “todas”, “info”). +- Tests de transición desde grupo (no hay listados en el grupo; respuesta por DM). + +--- + +## Fase 2 — Infra de Onboarding por DM (sin migraciones) + +Objetivos +- Implementar un onboarding DM que se dispare al crear una tarea en un grupo, con 2 variantes: + - Mensaje 1 (initial): CTA “/t tomar {CÓDIGO}” + “/t info”. + - Mensaje 2 (reminder): mini‑chuleta (“/t mias”, “/t todas”, “/t configurar …”, “/t web”). +- Cumplir reglas: máx. 2 DMs por usuario, separados ≥ 14 días; cap por evento; sin mensajes en grupos. + +Archivos a modificar +- src/services/group-sync.ts (añadir listActiveMemberIds(groupId): string[]) +- src/services/response-queue.ts (añadir helpers para onboarding: enqueueOnboarding y getOnboardingStats; reutilizar metadata JSON con kind='onboarding') +- src/services/command.ts (desencadenar onboarding tras crear tarea en grupo, respetando gating y caps) +- src/services/allowed-groups.ts (usado para gating en modo enforce) +- src/services/identity.ts y src/services/contacts.ts (solo consumo; no se cambian) + +Overview de cambios +- GroupSyncService: nuevo helper para obtener IDs de miembros activos del grupo (solo dígitos, grupos activos, no comunidad/archivados). +- ResponseQueue: + - enqueueOnboarding(recipient, message, metadata) con metadata canónica: { kind: 'onboarding', variant: 'initial'|'reminder', group_id, task_id, display_code }. + - getOnboardingStats(recipient): { total, lastSentAt } consultando response_queue por metadata.kind='onboarding'. +- CommandService (en /t nueva): + - Tras crear la tarea en grupo, construir candidatos: + - miembros activos del grupo (GroupSync.listActiveMemberIds), + - excluir creador, asignados y el número del bot, + - filtrar por /^\d+$/, + - si GROUP_GATING_MODE=enforce y el grupo no está allowed → no enviar. + - Cap por evento (ONBOARDING_EVENT_CAP, p. ej. 30). + - Para cada destinatario: + - stats.total=0 → enviar Mensaje 1. + - stats.total=1 y lastSentAt <= now-14 días → enviar Mensaje 2. + - En cualquier otro caso → no enviar. +- Envío inmediato (next_attempt_at = now). Ventanas horarias opcionales (ver Fase 4). + +Copys de onboarding (exactos) +- Mensaje 1: + - “Hola, soy el bot de tareas. En ‘{Grupo}’ acaban de crear una tarea: #{CÓDIGO} {descripción corta} + Encárgate: /t tomar {CÓDIGO} · Más info: /t info + Nota: nunca respondo en grupos; solo por privado.” +- Mensaje 2 (mini‑chuleta, solo si no interactuó aún): + - “Guía rápida (este es un mensaje único): + · Tus tareas: /t mias · Todas: /t todas + · Recordatorios: /t configurar diario | l‑v | semanal + · Web: /t web” + +Impacto en tests +- Tests unitarios para: + - Construcción de destinatarios (exclusiones, cap). + - Idempotencia por usuario (0 → initial; 1 y >14d → reminder; resto skip). + - Gating enforce (grupo no allowed → no enviar). + - Metadata de enqueue (kind='onboarding', variant correcto). + +Notas sobre migraciones +- No se requiere migración: se usa response_queue como fuente de verdad para conteo/fecha de onboarding por usuario (consultando metadata.kind='onboarding'). + +--- + +## Fase 3 — Ajustes de ayuda (Help v2) y refuerzos en DMs operativos + +Objetivos +- Actualizar help rápido/completo con alias y nuevas recomendaciones. +- Añadir CTAs discretos al final de DMs operativos existentes (ack al crear y DM al asignado). + +Archivos a modificar +- src/services/messages/help.ts +- src/services/command.ts (añadir línea discreta al final de acks y DMs al asignado) + +Overview de cambios +- Help rápido: + - “Ver mis: /t mias (por privado)” + - “Ver todas: /t todas (por privado)” + - “Más info: /t info” + - Retirar “ver grupo” de la guía básica; sugerir web (“/t web”). +- Help completo: reflejar “mias/todas/info” y la política de “no responder en grupos”. +- CTAs discretos al final de DMs operativos: + - “Tus tareas: /t mias · Todas: /t todas · Info: /t info · Web: /t web” + +Impacto en tests +- Actualizar snapshots/expectativas del help y de los DMs. + +--- + +## Fase 4 — Métricas y flags de configuración + +Objetivos +- Medir adopción y salud del onboarding y de alias. +- Controlar comportamiento con variables de entorno. + +Archivos a modificar +- src/services/command.ts (instrumentación Metrics.inc/set donde corresponda) +- src/services/response-queue.ts (contadores al encolar onboarding) +- src/services/group-sync.ts (counters si se desea, p. ej. “onboarding_skipped_not_allowed”) +- src/services/metrics.ts (no requiere cambios de API) + +Métricas propuestas +- onboarding_dm_sent_total (labels: variant=initial|reminder, group_id) +- onboarding_dm_skipped_total (labels: reason, group_id) + - reasons: 'cooldown_active', 'capped_event', 'not_allowed', 'disabled', 'no_members', 'no_group', 'not_group_context', 'no_display_code' +- onboarding_recipients_capped_total (labels: group_id) +- commands_alias_used_total (labels: action=info|mias|todas) +- commands_blocked_total (ya existe para gating; mantener) + +Flags/env sugeridas +- ONBOARDING_DM_ENABLED=true +- ONBOARDING_DM_COOLDOWN_DAYS=14 +- ONBOARDING_EVENT_CAP=30 +- ONBOARDING_ENABLE_IN_TEST=false (o true si se van a probar envíos en tests) +- GROUP_GATING_MODE=enforce|off (ya existente) +- Opcional (si se diferencia horario amable): ONBOARDING_SILENCE_HOURS=22-08 (futuro) + +Overview de cambios +- Usar Metrics.inc/set en los puntos de decisión. +- Leer flags con defaults robustos y sin romper tests. + +--- + +## Fase 5 — Tests y validación end-to-end + +Objetivos +- Cubrir alias nuevos, cambios de routing, y lógica de onboarding. +- Garantizar “cero mensajes en grupo”. + +Áreas de test +- Alias: + - “/t info” → ayuda + - “/t mias” → listado de asignadas + - “/t todas” → listado combinado (DM) + - “/t ver” (DM) → “todas” +- Contexto grupo: + - Invocar listados desde un grupo responde por DM con transición (no lista en el grupo). +- Onboarding: + - Evento de creación en grupo dispara destinatarios esperados (excluye creador/asignados/bot; cap). + - 0 → initial, 1 y >14 días → reminder, resto → skip. + - Gating enforce: grupos no permitidos → no enviar. + - Metadata de response_queue correcta (kind, variant). +- Help v2 actualizado (snapshots). +- CTAs añadidos al final de DMs operativos. + +--- + +## Fase 6 — Despliegue y control + +Objetivos +- Desplegar con seguridad y capacidad de rollback. +- Observar métricas clave. + +Checklist de despliegue +- Activar ONBOARDING_DM_ENABLED en staging, validar envíos y métricas. +- Validar alias y help actualizados. +- Monitorizar: + - onboarding_dm_sent_total vs skipped. + - Uso de “/t mias”, “/t todas”, “/t info”. + - web_tokens_issued_total (por “/t web”). +- Habilitar en producción. Ajustar ONBOARDING_EVENT_CAP si hay grupos muy grandes. + +--- + +## Fase 7 — Consideraciones futuras (no bloqueantes) + +Ideas a evaluar después +- “Bienvenida al primer DM inbound” (mensaje corto de bienvenida una única vez cuando el usuario inicia chat). +- Ventanas horarias: programar next_attempt_at si se detecta horario nocturno (requiere mínima lógica extra). +- Tabla explícita de onboarding (si se quiere persistir fuera de response_queue), p. ej. user_onboarding con timestamps y contadores. +- Resumen semanal opt‑in (ya soportado con “/t configurar …”): medir retención y satisfacción. + +--- + +## Resumen de archivos a cambiar (referencia) + +- src/services/command.ts + - Alias y routing: “info”, “mias”, “todas”; “/t ver” en DM => “todas”. + - Mensaje de transición al detectar listados desde grupo (solo DM). + - Disparo de onboarding tras crear tarea en grupo (con caps y cooldown). + - CTAs discretos al final de acks y DMs al asignado. + - Instrumentación de métricas. + +- src/services/messages/help.ts + - Actualizar copys a “/t mias”, “/t todas”, “/t info”. + - Retirar “ver grupo” del básico y empujar web para ver todo el grupo. + +- src/services/group-sync.ts + - Añadir listActiveMemberIds(groupId): string[]. + +- src/services/response-queue.ts + - Añadir enqueueOnboarding() y getOnboardingStats(). + - Incrementar métricas al encolar. + +- src/services/allowed-groups.ts + - Solo consumo para gating (no cambios de API). + +- src/utils/whatsapp.ts, src/utils/formatting.ts, src/utils/icons.ts + - Sin cambios estructurales; mantener estilos y símbolos. + +- src/services/metrics.ts + - Reutilización. No requiere cambios, solo llamadas desde los puntos anteriores. + +--- + +## Copys finales (para implementación) + +1) Onboarding — Mensaje 1 (initial) +- “Hola, soy el bot de tareas. En ‘{Grupo}’ acaban de crear una tarea: #{CÓDIGO} {descripción corta} + Encárgate: /t tomar {CÓDIGO} · Más info: /t info + Nota: nunca respondo en grupos; solo por privado.” + +2) Onboarding — Mensaje 2 (reminder, único) +- “Guía rápida (este es un mensaje único): + · Tus tareas: /t mias · Todas: /t todas + · Recordatorios: /t configurar diario | l‑v | semanal + · Web: /t web” + +3) Transición cuando se intenta listar desde grupo (responder por DM) +- “No respondo en grupos. Tus tareas: /t mias · Todas: /t todas · Info: /t info · Web: /t web” + +4) Línea discreta al final de DMs operativos (ack creación y DM a asignados) +- “Tus tareas: /t mias · Todas: /t todas · Info: /t info · Web: /t web” + +--- + +## Riesgos y mitigaciones + +- Saturación en grupos grandes → Cap por evento (ONBOARDING_EVENT_CAP, p. ej. 30) + cooldown 14 días por usuario. +- IDs no resueltos → Filtrar a /^\d+$/ y excluir alias no mapeados. +- Confusión por comandos antiguos → Alias “mias/todas/info” visibles en help; mensajes de transición desde grupo. +- Métricas y observabilidad → Añadir contadores con labels para entender adopción y fricción. + +---