Plan ejecutable por cliente, según las instrucciones de Nacho + el relevamiento verificado de hoy. Cada sección se lanza en su propio repo.
Esto lo ordenó Nacho y ya lo aplicamos: n8n es el ÚNICO que refresca el token. La app solo LEE de Postgres. Cero OAuth propio.
| Pieza | Qué hace | Estado hoy |
|---|---|---|
| Webhook (n8n) | Arranque, una vez: el cliente aprueba en ML → siembra el primer token en Postgres. | — |
| Cron (n8n) | Mantenimiento, cada 2 h: agarra el refresh y pide un access nuevo (el access dura 6 h). Es "el que trae el refresh". | — |
| La app | Lectora pura: getAccessToken() hace un SELECT. Ante un 401: un solo reintento que RE-LEE de Postgres. Jamás refresca. | a construir (packet lector ~40 líneas) |
| Vigilancia | Como la app ya no se auto-cura, hace falta errorWorkflow + aviso si un cron se cae o un token vence. | a montar |
Se cae del plan viejo todo el OAuth propio con candado (el "auth como el SaaS"). El packet @traid/ml-oauth pasa de módulo de login a lector. Lo único que se porta del SaaS es la taxonomía de errores terminal/transitorio de traid-saas/packages/ml/src/oauth.ts (classifyTokenError).
Sebastián · Argentina (MLA) · repo traid-grafica-limite (fork de electronica-ar)
| Pieza | Ruta | Estado |
|---|---|---|
| Motor de packaging / combos (función pura) | traid-grafica-limite/lib/packaging/packaging.ts (151 L) | 24/24 tests ✓ |
| Scaffold Next 16 + build | repo | build verde |
feat/f0-1-scaffold-packaging) — hoy main no tiene ni el scaffold ni el motor.TRAID/src/pages/DemoSebastianPage.tsx (390 L) + TRAID/src/lib/demoData.ts (90 L). Reescribir de React Router a Next 16.traid-electronica-ar/components/dashboard/ (8 archivos: kpi-card, page-header, empty-state, coverage-panel…).xlsx), panel de números gruesos, estado vacío explicativo, y las primeras tablas Drizzle skus + presentaciones con RLS inline en la misma migración.Catálogo de ~2.000 publicaciones + sync. Portar de electronica-ar: lib/ml/oauth-token-manager.ts (65 L), items-api.ts (122 L), catalog-sync.ts (317 L, modo scan), lib/sync/sync-runs.ts (210 L). Cambiar MLA→MLA y sebastian→sebagrafica.
Gonza · Argentina (MLA), 2 cuentas · repo traid-acero-plancheta a crear · Neon crimson-frost-03476773 ya existe
traid-acero-plancheta + Vercel. Fork del patrón de traid-electronica-ar (MLA + Neon + Drizzle, 620 tests verdes) — NO de traid-hernan.ml_oauth_tokens por account_id UUID con índice único real + RLS ENABLE. El lector de token de ~40 líneas.| Pieza | Ruta origen |
|---|---|
| Filas del centro de promos | traid-electronica-ar/lib/promos/centro-rows.ts (319 L) |
| Comisión real de ML (no hardcodeada) | traid-electronica-ar/lib/charges/mla.ts (101 L) |
| API de promos | traid-electronica-ar/lib/ml/promos-api.ts |
| Pantalla (declara "SOLO LECTURA de ML") | traid-electronica-ar/app/(dashboard)/promociones/centro/ (page 59 L + client 515 L) |
Packet traid-saas/packages/costos/src (13 archivos, 93 tests, dep @traid/port) + traid-electronica-ar/lib/costos/import.ts + lib/promos/margen-iva.ts (141 L, IVA AR 21/10,5) + lib/promos/resolve-tasa-iva.ts (49 L).
Las 12 vistas materializadas de traid-pablo/supabase/migrations/20260526_materialized_views.sql (362 L): daily_revenue (evolución) · pareto_products (ranking 80/20) · neto_meli_monthly (cargos desglosados). Cambiar account_label texto → account_id UUID y limpiar el filtro is_whitelabel (concepto del negocio de Pablo).
offers+metrics. (b) Falta la 2ª cuenta. (c) El Excel de costos de Gonza para que el semáforo tenga color (sin él, todo en "sin costo").
Sin deal firmado · 3 cuentas MLA · Neon crimson-breeze-34033409
onError=continueRegularOutput de los nodos Postgres (o chequeo por conteo de filas).SEND HTTP ANSWER3) está deshabilitado. Ningún comprador de iupi recibió nunca una respuesta. Replicar ahora es copiar una promesa, no un resultado.
Antes de replicar: una sesión para sacar un bot de sombra en Vito (banco de pruebas traid-vito/docs/SPEC-...banco-pruebas-bots-gate-golive.md, npm run bots:test-loop). Camino de replicado ya probado: mati-satine-software/docs/kit-bots-portable/ (así nació Vito). Si es para el producto, el origen correcto es traid-saas/packages/agents, no traid-vito.
| # | Qué | Depende de | Estado |
|---|---|---|---|
| 0 | Higiene de tokens transversal (errorWorkflow + alertas + cron de Alan leyendo de DB) | nadie | a hacer |
| 1 | Gráfica — primera versión mostrable (packaging + Excel, sin ML) | nadie · el material ya está | arranca ya |
| 2 | Plancheta — fundación + promos/métricas en LECTURA | token read-only (ya vivo) | arranca ya |
| 1b | Gráfica — catálogo + dashboard con datos ML reales | auth de Seba | bloqueado |
| 2b | Plancheta — escritura de promos + 2ª cuenta + semáforo con color | re-auth de Gonza (scopes) + Excel de costos | bloqueado |
| 3 | Alan — higiene de seguridad | nadie | a hacer |
| 3b | Alan — bots (evaluación, no replicado) | sacar 1 bot de sombra en Vito | condicionado |
La lectura corta: Gráfica y Plancheta arrancan hoy sin depender de nadie (Gráfica con el Excel, Plancheta con el token de lectura que ya vive). Lo que necesita el click del cliente es la segunda mitad de cada uno (datos ML reales / escritura). Alan es solo higiene. El auth de Gráfica corre en paralelo — se lo pedimos a Nacho/Seba mientras construimos lo que no lo necesita.