Web app: role portals, onboarding conversacional y deployment con Cloudflare
Qué hay en esta rama
Primera versión accesible del CMOAgent como web app con auth y roles. URL de testing (laptop-dependent por ahora): https://cmo.laparedita.com
Nuevas superficies web
-
/onboarding/— guía conversacional de 7 pasos, ES/EN, sin jerga previa. Explica AppLovin, soft-launch, LiveOps, etc. en línea. Persiste el budget en/api/setup/budgets. -
/cto/— salud técnica: readiness, inventario de conectores (stub/bridge/simulate), rollbacks y acciones bloqueadas recientes. -
/art/— hooks dominantes del mercado, fatiga de creatividades vivas (IPM/CTR/CPI), movimientos creativos de competencia, consejos de briefs. -
/trends/— agregador de tendencias con filtros por plataforma y ventana temporal. -
/— cockpit CEO existente + selector de rol en el header.
Infra y deployment
- HTTP basic auth opt-in con multi-usuario: `CMO_WEB_AUTH_USERS=ceo:pass1,cto:pass2,art:pass3`. Comparación en tiempo constante. Modo legacy single-user por compatibilidad.
- `Dockerfile` + `docker-compose.yml` con Postgres bundled y migraciones auto-aplicadas al primer boot.
- Bootstrap migrations (`000_extensions.sql`, `001_tripleos_base_stub.sql`) que crean las extensiones de Postgres, `update_updated_at()`, y stubs mínimos de `work_items`/`policies`/`approvals`/`budgets` para correr el repo standalone. En producción TripleOS estos stubs son no-op (IF NOT EXISTS).
- Cloudflare Named Tunnel dedicado (`cmoagent`, distinto del `laparedita-elena` personal existente) apuntando a `cmo.laparedita.com`.
- Scripts `tunnel-cmoagent.sh`, `tunnel.sh` (quick tunnel fallback), `stop-all.sh`.
Fixes
- `PolicyMemoIngestion.seed_defaults()` pasaba `superseded_at` y strings ISO a `upsert_policy_memo` — rompía contra Postgres real. Filtrado a kwargs aceptados y `model_dump(mode="python")`.
Test plan
-
71/71 pytest verde (incluyendo 14 nuevos de role_portals y 13 de web_auth) -
401 sin auth, 200 con cada credencial (CEO/CTO/Arte) verificado en cmo.laparedita.com -
Cross-auth: usuario CTO con pass CEO devuelve 401 correctamente -
Onboarding responde en ES y EN, guarda budget en /api/setup/budgets -
Readiness y role APIs responden con datos reales tras migraciones -
CTO y Arte usan su vista durante 48h y dan feedback (posterior al merge) -
Migrar del tunnel-en-laptop a hosting durable cuando se valide el producto
Limitaciones conocidas
- Todos los usuarios autenticados pueden acceder a todas las rutas. La separación actual es solo de UI (cada rol aterriza en su página); no hay RBAC que impida al CTO hacer POST a `/api/setup/budgets`. Siguiente iteración.
- Laptop-dependent: si el Mac del CEO duerme, la URL cae. Movemos a Render/Fly cuando se valide demanda.
- Panel de tendencias vacío hasta que alguien alimente `market_signals`/`competitor_snapshots` (vía `ingest signals`/`ingest competitors`). Sin datos, muestra el mensaje de guía esperado.