Skip to content

Web app: role portals, onboarding conversacional y deployment con Cloudflare

isidro requested to merge claude/frosty-chandrasekhar-57cb44 into main

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.

🤖 Generated with Claude Code

Merge request reports