|
1 | | -# Protocolo 15 días — Julio en portátil |
| 1 | +# Folvy — PROTOCOLO DE TRABAJO EN REMOTO (15 días sin el PC principal) |
2 | 2 |
|
3 | | -**Creado:** 17/08/2026. **Vigente:** mientras Julio esté fuera de su PC habitual. |
| 3 | +> **17/08/2026 · v3.** Julio trabaja desde un portátil ~15 días. Objetivo: **que no se pierda nada y |
| 4 | +> que no se duplique nada.** Este documento manda mientras dure. |
| 5 | +> |
| 6 | +> ⚠️ **v1** partía de una premisa falsa —que Code corría en el PC de Julio— y se preocupaba del |
| 7 | +> riesgo equivocado. Corregida el 17/08 con la comprobación de entorno. |
| 8 | +> ⚠️ **v2** llevaba una ventana de despliegue inventada (11:00). Corregida en la v3 con datos. |
4 | 9 |
|
5 | | -> **Nota de procedencia.** Este fichero **no existía en el repo** cuando se pidió |
6 | | -> actualizarlo: vivía como documento de claude.ai, que Claude Code no puede leer. |
7 | | -> Se crea aquí con lo único que consta verificado — la ventana de despliegue y su |
8 | | -> evidencia. Si el original tenía más apartados, faltan y hay que traerlos. |
| 10 | +--- |
| 11 | + |
| 12 | +## 0. Dónde corre Code — el dato que lo cambia todo |
| 13 | + |
| 14 | +**Code NO corre en el PC ni en el portátil de Julio.** Corre en un **contenedor Linux efímero en la |
| 15 | +nube**, que **clona el repo de cero al arrancar cada sesión** y **se recicla tras un rato de |
| 16 | +inactividad**. |
| 17 | + |
| 18 | +1. **Dónde esté Julio da igual.** El repo de trabajo es **GitHub**. |
| 19 | +2. **El riesgo real no es el viaje: es el contenedor.** Ese disco desaparece y no vuelve. **Todo se |
| 20 | + empuja a `origin` en cuanto existe.** Nada se acumula en local "para el final". |
| 21 | +3. **`node_modules` no sobrevive.** Cada sesión nueva necesita `npm install` antes de `tsc -b` o |
| 22 | + `vite build`. Está **permitido** y no hay que consultarlo. |
| 23 | + |
| 24 | +--- |
| 25 | + |
| 26 | +## 1. El puente: el repo es lo único que Code ve |
| 27 | + |
| 28 | +**Los documentos del proyecto de claude.ai son INVISIBLES para Code.** Entre el 16 y el 17/08 esto |
| 29 | +bloqueó el trabajo **cinco veces**. |
| 30 | + |
| 31 | +> **Regla, endurecida el 17/08: ningún encargo declara «contexto obligatorio» un documento de |
| 32 | +> claude.ai.** O el contenido va dentro del encargo, o no se cita. Si un documento debe persistir, |
| 33 | +> se le pasa el contenido y **Code lo commitea él mismo en `claude/` del repo**. |
| 34 | +
|
| 35 | +| Artefacto | Canónico | Copia | |
| 36 | +|---|---|---| |
| 37 | +| Decisiones, diseños, encargos, hallazgos | **Proyecto claude.ai** | `claude/` del repo, **con fecha en cabecera** | |
| 38 | +| Código, migraciones, tipos | **Repo** | — | |
| 39 | +| Verdad viva del sistema | `folvy_mapa_sistema.md` (**repo**) | resumen en el proyecto al cerrar | |
| 40 | + |
| 41 | +**Si difieren, manda el proyecto para decisiones y el repo para código.** Sin fecha no se sabe cuál |
| 42 | +es la vieja — eso costó ocho horas el 15/08 con la paleta archivada. |
9 | 43 |
|
10 | 44 | --- |
11 | 45 |
|
12 | | -## 1. Ventana de despliegue |
| 46 | +## 2. Ritual de arranque (cada sesión, sin excepción) |
13 | 47 |
|
14 | | -**Se despliega hasta las 12:15. Prohibido entre las 12:15 y las 23:45.** |
| 48 | +1. Leer `claude/folvy_arranque_prompt.md` y `claude/folvy_indice.md`. |
| 49 | +2. Leer el registro de frentes (§4). |
| 50 | +3. **No dar nada por vigente de memoria.** Comprobar contra el proyecto, el repo o la BBDD. |
| 51 | +4. Si hay que compilar: `npm install` primero. |
15 | 52 |
|
16 | | -Se aplica a: merges a `main` (disparan `build-apk` → bundle OTA a las tablets), |
17 | | -despliegues de Edge Functions, y migraciones. |
| 53 | +## 3. Ritual de cierre (obligatorio aunque la sesión dure diez minutos) |
18 | 54 |
|
19 | | -### Por qué esas horas, y por qué NO son las 11:00 |
| 55 | +1. **Qué se hizo**, con su verificación — o declarando explícitamente lo NO verificado. |
| 56 | +2. **Qué queda abierto**, y quién lo desbloquea. |
| 57 | +3. **Qué se decidió y por qué** — para no re-litigarlo. |
| 58 | +4. **Deudas nuevas**, cada una con su **disparador**. |
20 | 59 |
|
21 | | -La ventana anterior decía «nunca entre las 11:00 y las 23:45». **Ese 11:00 era una |
22 | | -estimación que nadie comprobó.** El dato real de 30 días de Foodint lo desmiente: |
| 60 | +--- |
| 61 | + |
| 62 | +## 4. Registro de frentes — estado al cierre del 17/08 |
| 63 | + |
| 64 | +### Cerrado y verificado |
| 65 | + |
| 66 | +- Módulo HubRise, backend completo (F1 + 2.0–2.7), certificado en laboratorio y producción. |
| 67 | +- Pre-audit de HubRise **cerrado por Antoine el 05/08**. No se le debe respuesta. Tope: **5 locales vivos**; el nº 6 dispara auditoría. |
| 68 | +- **PR #81 mergeada a `main`** el 17/08 (`14a9f73`, merge normal). Pipeline verde (run 141). |
| 69 | +- **Carabanchel conectado a HubRise** el 17/08 a las 09:12 — paso 0, con el módulo `kind='location'`. Verificado: `external_location_id=1b6p8-2`, `location_id=92d7656e…`, `ei.location_id` **no NULL** (el trigger quedó esquivado), token presente. **La identidad de `1b6p8-2` quedó confirmada por la API de HubRise**, no por captura. |
| 70 | +- **Rediseño de `EditPricesModal`** + **pantalla de reconciliación de marcas** + **panel de catálogos**, mergeados a `main` el 17/08 (`84553f2`). **Pipeline verde (run 142, 10:55), OTA publicada** — dentro de ventana. |
| 71 | +- `hubrise-catalog-create` **v1 desplegada** (crea y mapea, **sin publicar**). |
| 72 | + |
| 73 | +### El hallazgo que salvó a Alcalá |
| 74 | + |
| 75 | +`hubrise-catalog-publish` **sólo acepta `brand_id`** y selecciona `brand_hubrise_catalog` **sin |
| 76 | +filtro de local**; `hubrise-brand-connect` la llama así. Reutilizarla para Carabanchel **habría |
| 77 | +republicado el catálogo `j99jm` de Alcalá en producción**. Por eso existe una función nueva y |
| 78 | +estrecha. Verificado leyendo el código desplegado. |
23 | 79 |
|
24 | | -| Hora | Ventas en 30 días | |
| 80 | +### Carabanchel — dónde está de verdad |
| 81 | + |
| 82 | +| Capa | Estado | |
25 | 83 | |---|---| |
26 | | -| 11:00 | **0** | |
27 | | -| 12:00 | 3 sueltas, en 2 días de 30 | |
28 | | -| 13:00 | **266** — los 30 días de 30 | |
| 84 | +| Conexión Folvy ↔ HubRise | ✅ hecha y verificada | |
| 85 | +| Bridges en HubRise | ✅ **15 creados** (6 marcas propias × plataformas con escaparate), nombres corregidos | |
| 86 | +| Activación de los bridges | ❌ **ninguna** — requiere trámite con soporte | |
| 87 | +| Catálogos por marca | ❌ 0 | |
| 88 | +| Mapeos de marca | ❌ 0 | |
| 89 | +| Pedidos recibidos | 0 | |
| 90 | + |
| 91 | +**Las 15 conexiones apuntan al catálogo genérico `Foodint · bnnpd`.** El bridge **también empuja el |
| 92 | +menú hacia la plataforma**: activar una así puede publicar el menú equivocado en un escaparate vivo. |
| 93 | +**Ninguna se activa antes de tener su catálogo y estar reapuntada.** |
| 94 | + |
| 95 | +**Un bridge no se crea: se solicita.** Uber es autoservicio; Glovo y Just Eat van por correo |
| 96 | +(Janaina / `support@hubrise.com`), con plazo de terceros. |
| 97 | + |
| 98 | +### 🔴 La decisión que gobierna todo y sigue sin tomarse |
| 99 | + |
| 100 | +El formulario de activación avisa: **Glovo rechaza la conexión si la tienda sigue en otro TPV o |
| 101 | +middleware.** Los escaparates de Foodint están en **Last.app** (Alcalá, 14 días: **597 ventas por |
| 102 | +Last.app frente a 84 por HubRise**). |
29 | 103 |
|
30 | | -Nadie usa la app antes de las **12:45**, salvo los **fichajes de las 12:30**. |
| 104 | +**Activar un bridge no añade un canal: sustituye al que hay.** Es una migración de producción, marca |
| 105 | +por marca, con facturación viva. **Decisión de negocio de Julio, sin marcha atrás barata.** |
31 | 106 |
|
32 | | -Esa es la frontera dura: **12:30, por los fichajes.** La ventana se cierra a las |
33 | | -**12:15** para dejar quince minutos de margen — el pipeline tarda, y un despliegue |
34 | | -que empieza a tiempo puede terminar tarde. |
| 107 | +### Espera a Julio (sólo él puede) |
35 | 108 |
|
36 | | -### Cómo se lee esto |
| 109 | +- **La decisión de migración desde Last.app** (arriba). Bloquea todo lo demás de Carabanchel. |
| 110 | +- **Captura desaturada de los tres estados** del modal de precios — la primera mirada humana al rediseño ya desplegado. |
| 111 | +- **Ensayo del panel de catálogos** en `/_admin/hubrise` (laboratorio) y el `dry_run` de scope sobre Alcalá. |
| 112 | +- Email de **Janaina** sobre pausa por marca virtual. |
| 113 | +- Banner de **VAT intracomunitario** de la cuenta HubRise. |
| 114 | +- Los **9 turnos de Marlón Mafla** dentro de su semana de vacaciones (3–9 ago). |
37 | 115 |
|
38 | | -El límite no es «la hora a la que se puede pulsar»: es **la hora a la que tiene que |
39 | | -estar terminado**. Si el pipeline no acaba antes de las 12:15, **no se fuerza**: el |
40 | | -trabajo se queda en la rama y sale esa noche después de las 23:45. |
| 116 | +### Deudas declaradas el 17/08 |
| 117 | + |
| 118 | +| Deuda | Disparador | |
| 119 | +|---|---| |
| 120 | +| **Folvy no puede operar sobre la cuenta de un cliente.** Ningún usuario pertenece a dos cuentas; el único platform admin sólo está en el laboratorio; la RLS sigue siendo por cuenta. | **Cliente 2.** Es Fase 0. | |
| 121 | +| **449 ventas sin marca atribuida en Kitchen Grill LstQ** (6 claves, una viva el 16/08). La rentabilidad por marca de esa cuenta está incompleta. | Triaje con la pantalla de reconciliación. | |
| 122 | +| **Bandas de salud del margen** sin definir. `foodCostStatus === 'over'` es un sustituto interino; el ámbar no aparecerá hasta que haya escandallos. | Cuando haya escandallos. | |
| 123 | +| **`sales_channel.color` a NULL** en las 3 cuentas. Fallback por nombre ya puesto; poblar la columna lo convierte en dato. | Cuando se quiera; ya no bloquea. | |
| 124 | +| **`sw.js:62`** — `event.respondWith(fetch(req))` sin `.catch()`: no-op que sólo añade un modo de fallo. Ruido de consola, no fallo funcional. | Cuando Julio pueda mirar una tablet. **No se toca en remoto.** | |
| 125 | +| **`hubrise-catalog-create` desplegada no es byte a byte lo del repo** (cabecera y acentos), por falta de `SUPABASE_ACCESS_TOKEN` en el contenedor. | El v2 se despliega desde el repo. | |
| 126 | +| **El traductor del navegador traduce los nombres de las conexiones de HubRise** («Bendito Burrito» → «Burrito Bendito»). El nombre es clave de mapeo. | Desactivar traducción en `manager.hubrise.com`. **Hecho.** | |
| 127 | + |
| 128 | +--- |
| 129 | + |
| 130 | +## 5. Ramas: no dejar crecer la pila |
| 131 | + |
| 132 | +- **Merge normal, nunca squash.** El squash rompe la línea y fabrica el conflicto que evitamos. |
| 133 | +- Lo certificado por captura se mergea. **Lo no verificado no se mergea ni se apila más.** |
| 134 | +- Una rama por encargo. Nunca empujar a una ya mergeada. |
41 | 135 |
|
42 | 136 | --- |
43 | 137 |
|
44 | | -## 2. Persistencia |
| 138 | +## 6. Qué se puede hacer, y qué no |
| 139 | + |
| 140 | +**Sí, todo desde el navegador:** verificar en previews de Vercel por captura · panel de Supabase · |
| 141 | +consola de HubRise · correo · diseñar, decidir, escribir encargos y maquetas. |
| 142 | + |
| 143 | +**No, o con extremo cuidado:** |
| 144 | + |
| 145 | +- **Regla de las 5 etapas intacta**: commit → push → PR/merge → deploy → **verificado en vivo**. |
| 146 | +- **Ningún despliegue de `hubrise-webhook`** — camino vivo de pedidos de Alcalá. |
| 147 | +- **Nada que exija estar delante de una tablet o del local.** |
| 148 | + |
| 149 | +### 🕐 Ventana de despliegue — corregida el 17/08 con datos |
| 150 | + |
| 151 | +> **Los despliegues tienen que estar TERMINADOS a las 12:15.** |
| 152 | +> **Prohibido 12:15 → 23:45.** |
| 153 | +
|
| 154 | +El límite **no es la hora de pulsar, es la hora a la que tiene que estar acabado** — pipeline y OTA |
| 155 | +incluidos. |
| 156 | + |
| 157 | +Evidencia (30 días de Foodint, hora local): |
| 158 | + |
| 159 | +| Hora | Ventas | Días con venta | |
| 160 | +|---|---|---| |
| 161 | +| 11 | 0 | 0 de 30 | |
| 162 | +| 12 | 3 | 2 de 30 | |
| 163 | +| **13** | **266** | **30 de 30** | |
| 164 | +| 21 | 455 | 30 de 30 | |
| 165 | + |
| 166 | +Entre las 03:00 y las 12:00 no hay prácticamente nada. **La restricción no son las ventas: son los |
| 167 | +fichajes de las 12:30.** Julio confirma que nadie usa la app antes de las 12:45, salvo fichajes. |
| 168 | + |
| 169 | +⚠️ La v2 de este protocolo decía «11:00 → 23:45». **Ese 11:00 no salía de ningún dato** — era un |
| 170 | +colchón inventado que se coló como regla. Corregido. |
| 171 | + |
| 172 | +--- |
| 173 | + |
| 174 | +## 7. Reglas que no se relajan |
| 175 | + |
| 176 | +- **Inventario antes de construir.** Ninguna tarea empieza escribiendo código. |
| 177 | +- **Verificar, no deducir** — contra BBDD, código desplegado o doc oficial. |
| 178 | +- **Distinguir lo verificado de lo no verificado** en cada informe. `NO_RESUELTO` es salida legítima. |
| 179 | +- **Un `location_id` o un `brand_id` nunca se identifica por su nombre.** El laboratorio replica los |
| 180 | + nombres de producción: hay dos «Foodint Carabanchel» y dos «Bendito Burrito». Siempre por UUID. |
| 181 | +- **El silencio sólo es resultado** si antes se ha provocado el ruido y se ha visto llegar. |
| 182 | +- **Todo andamiaje temporal nace con su disparador de borrado escrito.** |
| 183 | +- **Nada es HECHO** hasta verificado en vivo. |
| 184 | +- **Toda pantalla nueva de cara al cliente se maqueta y se aprueba antes de construirse.** |
| 185 | +- **Empujar a `origin` en cuanto exista.** El contenedor de Code es efímero. |
| 186 | +- **Nada que Julio tenga que hacer por consola del navegador es producto.** Si hace falta una acción, |
| 187 | + se construye un botón. |
| 188 | + |
| 189 | +--- |
45 | 190 |
|
46 | | -Claude Code corre en un **contenedor efímero** que se recicla por inactividad. La |
47 | | -ubicación de Julio es irrelevante para eso; el riesgo es el contenedor. |
| 191 | +## 8. Al volver |
48 | 192 |
|
49 | | -- **GitHub es la única persistencia.** Todo se empuja a `origin` en cuanto existe. |
50 | | - Nada se queda «para el commit final». |
51 | | -- Los documentos del proyecto de claude.ai **son invisibles** para Claude Code. O el |
52 | | - contenido va dentro del encargo, o vive en el repo. Ha bloqueado el trabajo cuatro |
53 | | - veces (regla fijada el 17/08). |
54 | | -- Un despliegue programado para después de las 23:45 **no puede darse por hecho**: el |
55 | | - contenedor puede no seguir vivo. Se confirma explícitamente antes de contar con él. |
| 193 | +1. Repasar este registro contra la realidad — **no fiarse de él**, comprobar. |
| 194 | +2. Fusionar lo que quede apilado, en orden. |
| 195 | +3. Tomar la decisión de Last.app antes de tocar un solo bridge más. |
| 196 | +4. Retomar lo que exigía presencia física. |
0 commit comments