app/product/[slug]/page.tsx pre-renderizaba (SSG) las 17 páginas de detalle en build time del Docker image, donde HEADLESS_PROVIDER/MEDUSA_* no existen — el snapshot quedaba congelado con el catálogo mock (price: null para todos los productos).
Con revalidate = 60 y sin cacheHandler compartido entre las 2 réplicas de frontend-deploy, cada pod revalidaba su propia caché ISR de forma independiente: un producto podía mostrar "Consultar precio" en un pod y el precio real en el otro, según cuál se hubiera "calentado" con tráfico real.
El listado (app/catalog/page.tsx) nunca tuvo el bug porque es dinámico por searchParams y siempre pega en vivo contra Medusa.
Verifiqué contra la API de Medusa en vivo (mismo MEDUSA_REGION_ID que usa el frontend) que el precio y la región de los productos reportados como fallando (ej. "Mochilas Disney colección Marvel") son correctos — no es un problema de datos ni de regiones duplicadas en Colombia.
Fix
Reemplaza generateStaticParams + revalidate = 60 por export const dynamic = "force-dynamic", dejando la ruta de detalle siempre en vivo contra Medusa, igual que el listado.
Test plan
Verificar en el pipeline de Gitea Actions que la imagen se reconstruye y frontend.yaml se promueve automáticamente al mergear a main.
Tras el rollout, visitar /product/mochilas-disney-coleccion-marvel varias veces (idealmente contra ambos pods) y confirmar precio real en vez de "Consultar precio".
Confirmar que el resto de productos (toy-story-5-rex, mochila-pequena-bob-esponja, etc.) siguen mostrando el precio correctamente.
## Resumen
- `app/product/[slug]/page.tsx` pre-renderizaba (SSG) las 17 páginas de detalle en build time del Docker image, donde `HEADLESS_PROVIDER`/`MEDUSA_*` no existen — el snapshot quedaba congelado con el catálogo mock (`price: null` para todos los productos).
- Con `revalidate = 60` y sin `cacheHandler` compartido entre las 2 réplicas de `frontend-deploy`, cada pod revalidaba su propia caché ISR de forma independiente: un producto podía mostrar `"Consultar precio"` en un pod y el precio real en el otro, según cuál se hubiera "calentado" con tráfico real.
- El listado (`app/catalog/page.tsx`) nunca tuvo el bug porque es dinámico por `searchParams` y siempre pega en vivo contra Medusa.
- Verifiqué contra la API de Medusa en vivo (mismo `MEDUSA_REGION_ID` que usa el frontend) que el precio y la región de los productos reportados como fallando (ej. "Mochilas Disney colección Marvel") son correctos — no es un problema de datos ni de regiones duplicadas en Colombia.
## Fix
Reemplaza `generateStaticParams` + `revalidate = 60` por `export const dynamic = "force-dynamic"`, dejando la ruta de detalle siempre en vivo contra Medusa, igual que el listado.
## Test plan
- [ ] Verificar en el pipeline de Gitea Actions que la imagen se reconstruye y `frontend.yaml` se promueve automáticamente al mergear a `main`.
- [ ] Tras el rollout, visitar `/product/mochilas-disney-coleccion-marvel` varias veces (idealmente contra ambos pods) y confirmar precio real en vez de "Consultar precio".
- [ ] Confirmar que el resto de productos (toy-story-5-rex, mochila-pequena-bob-esponja, etc.) siguen mostrando el precio correctamente.
Product detail pages were generateStaticParams'd at Docker build time,
where MEDUSA_* env vars aren't set, so the static snapshot baked in the
mock catalog (price: null for all products). With revalidate=60 and no
shared ISR cache handler across the 2 frontend replicas, each pod healed
its own cache independently on next visit past staleness — so a product
could show "Consultar precio" on one pod and the real price on the other,
while the fully-dynamic catalog listing always hit Medusa fresh. Verified
against the live Medusa API that pricing/region data itself was correct
for the reported failing products.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01DXqBoNfYQNwFg65mbx2FWM
devops
merged commit 584a42ea72 into main2026-08-13 07:02:12 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Resumen
app/product/[slug]/page.tsxpre-renderizaba (SSG) las 17 páginas de detalle en build time del Docker image, dondeHEADLESS_PROVIDER/MEDUSA_*no existen — el snapshot quedaba congelado con el catálogo mock (price: nullpara todos los productos).revalidate = 60y sincacheHandlercompartido entre las 2 réplicas defrontend-deploy, cada pod revalidaba su propia caché ISR de forma independiente: un producto podía mostrar"Consultar precio"en un pod y el precio real en el otro, según cuál se hubiera "calentado" con tráfico real.app/catalog/page.tsx) nunca tuvo el bug porque es dinámico porsearchParamsy siempre pega en vivo contra Medusa.MEDUSA_REGION_IDque usa el frontend) que el precio y la región de los productos reportados como fallando (ej. "Mochilas Disney colección Marvel") son correctos — no es un problema de datos ni de regiones duplicadas en Colombia.Fix
Reemplaza
generateStaticParams+revalidate = 60porexport const dynamic = "force-dynamic", dejando la ruta de detalle siempre en vivo contra Medusa, igual que el listado.Test plan
frontend.yamlse promueve automáticamente al mergear amain./product/mochilas-disney-coleccion-marvelvarias veces (idealmente contra ambos pods) y confirmar precio real en vez de "Consultar precio".