Feedback Beta: el formulario confirma envío pero no persiste el comentario #192

Closed
opened 2026-08-04 12:31:07 +00:00 by rafa · 2 comments
Owner

Incidencia

Rafa envió desde el formulario Beta un feedback con el texto exacto "Comentario de prueba". El UI mostró éxito, pero no se creó ningún fea_feedback en producción.

Evidencia server-side (2026-08-04)

  • La tabla/CPT sigue en 246 registros; el último es #55439, 2026-08-03 02:53:59 UTC. No existe el comentario de prueba.
  • El mu-plugin está cargado: /web/wp-content/mu-plugins/fea-beta-feedback.php.
  • La barra Beta y el formulario se renderizan en la portada real (200).
  • El endpoint público POST /wp-json/fea/v1/feedback responde. Una sonda no destructiva con honeypot recibió 200 {"ok":true} y el contador permaneció 246 (comportamiento esperado: el honeypot evita escribir).

Causa probable / defecto confirmado en frontend

En fea-beta-feedback.php, líneas 276–287, el navegador llama a fetch() pero:

  1. No hace await ni comprueba response.ok / JSON.
  2. Ignora completamente los errores con .catch(function(){}).
  3. Muestra “Gracias” inmediatamente aunque la petición falle o reciba un 4xx/5xx.

Por tanto, el UI puede afirmar que el feedback se envió cuando no ha quedado persistido. La causa del fallo de transporte del cliente concreto aún no está confirmada; no hay access logs disponibles en el hosting para correlacionar la petición.

Propuesta (preparar y probar localmente; no desplegar sin validación)

  • Cambiar el submit a async, esperar la respuesta y exigir response.ok + {ok:true} antes de mostrar el agradecimiento.
  • Ante fallo HTTP/red, mantener el formulario abierto y mostrar un mensaje de reintento visible.
  • Añadir instrumentación mínima y no sensible para fallos de entrega (código HTTP/error; nunca el comentario ni IP).
  • Añadir prueba end-to-end local: envío válido crea exactamente un CPT fea_feedback; respuesta fallida no muestra éxito.

Criterios de aceptación

  • Un envío válido con “Comentario de prueba” queda visible en wp-admin/CPT y en el cron diario.
  • Un error de red/HTTP no se presenta como éxito.
  • El cambio queda probado localmente antes de cualquier cambio en producción.
## Incidencia Rafa envió desde el formulario Beta un feedback con el texto exacto **"Comentario de prueba"**. El UI mostró éxito, pero no se creó ningún `fea_feedback` en producción. ## Evidencia server-side (2026-08-04) - La tabla/CPT sigue en **246** registros; el último es `#55439`, `2026-08-03 02:53:59 UTC`. No existe el comentario de prueba. - El mu-plugin está cargado: `/web/wp-content/mu-plugins/fea-beta-feedback.php`. - La barra Beta y el formulario se renderizan en la portada real (`200`). - El endpoint público `POST /wp-json/fea/v1/feedback` responde. Una sonda no destructiva con honeypot recibió `200 {"ok":true}` y el contador permaneció `246` (comportamiento esperado: el honeypot evita escribir). ## Causa probable / defecto confirmado en frontend En `fea-beta-feedback.php`, líneas 276–287, el navegador llama a `fetch()` pero: 1. No hace `await` ni comprueba `response.ok` / JSON. 2. Ignora completamente los errores con `.catch(function(){})`. 3. Muestra “Gracias” inmediatamente aunque la petición falle o reciba un 4xx/5xx. Por tanto, el UI puede afirmar que el feedback se envió cuando no ha quedado persistido. La causa del fallo de transporte del cliente concreto aún no está confirmada; no hay access logs disponibles en el hosting para correlacionar la petición. ## Propuesta (preparar y probar localmente; no desplegar sin validación) - Cambiar el submit a `async`, esperar la respuesta y exigir `response.ok` + `{ok:true}` antes de mostrar el agradecimiento. - Ante fallo HTTP/red, mantener el formulario abierto y mostrar un mensaje de reintento visible. - Añadir instrumentación mínima y no sensible para fallos de entrega (código HTTP/error; nunca el comentario ni IP). - Añadir prueba end-to-end local: envío válido crea exactamente un CPT `fea_feedback`; respuesta fallida no muestra éxito. ## Criterios de aceptación - Un envío válido con “Comentario de prueba” queda visible en wp-admin/CPT y en el cron diario. - Un error de red/HTTP no se presenta como éxito. - El cambio queda probado localmente antes de cualquier cambio en producción.
Author
Owner

Fix preparado y validado en local — pendiente desplegar a prod

Causa confirmada: en fea-beta-feedback.php (líneas 276-287), el handler de envío llamaba a fetch() sin await, sin comprobar response.ok, y con .catch(function(){}) vacío. El UI mostraba "Gracias" de forma síncrona sin esperar la respuesta del servidor, así que un fallo de red o HTTP quedaba invisible para quien enviaba el feedback.

Fix: rama fix/feedback-beta-192 (commit c5704d7), pusheada a este repo. El handler ahora encadena la promesa, exige response.ok + {ok:true} antes de mostrar éxito, y si falla mantiene la tarjeta abierta con un mensaje de error visible (traducido a los 5 idiomas) y reactiva el botón para reintentar. Se añadió console.warn no sensible (solo código de error, nunca el comentario).

Validación local (WP Docker, puerto 8081, Playwright ad-hoc):

  • Caso envío OK (HTTP 200): "Gracias" visible, error oculto → exactamente 1 CPT fea_feedback creado.
  • Caso fallo de red (petición abortada): error visible, "Gracias" oculto, botón reactivado → 0 posts creados.
  • Verificado por conteo real en BD local antes/después (55 → 57 → 55 tras limpiar los de prueba).
  • php -l sin errores de sintaxis.

Resultado: funciona como se esperaba en local. Cumple los criterios de aceptación del issue.

Pendiente: no se ha tocado producción. Falta revisión y despliegue manual (el mu-plugin en prod se sube vía ssh cat > ruta, ver master-feadulta.md) cuando Rafa lo confirme.

## Fix preparado y validado en local — pendiente desplegar a prod **Causa confirmada:** en `fea-beta-feedback.php` (líneas 276-287), el handler de envío llamaba a `fetch()` sin `await`, sin comprobar `response.ok`, y con `.catch(function(){})` vacío. El UI mostraba "Gracias" de forma síncrona sin esperar la respuesta del servidor, así que un fallo de red o HTTP quedaba invisible para quien enviaba el feedback. **Fix:** rama `fix/feedback-beta-192` (commit `c5704d7`), pusheada a este repo. El handler ahora encadena la promesa, exige `response.ok` + `{ok:true}` antes de mostrar éxito, y si falla mantiene la tarjeta abierta con un mensaje de error visible (traducido a los 5 idiomas) y reactiva el botón para reintentar. Se añadió `console.warn` no sensible (solo código de error, nunca el comentario). **Validación local (WP Docker, puerto 8081, Playwright ad-hoc):** - Caso envío OK (HTTP 200): "Gracias" visible, error oculto → **exactamente 1 CPT `fea_feedback` creado**. - Caso fallo de red (petición abortada): error visible, "Gracias" oculto, botón reactivado → **0 posts creados**. - Verificado por conteo real en BD local antes/después (55 → 57 → 55 tras limpiar los de prueba). - `php -l` sin errores de sintaxis. **Resultado: funciona como se esperaba en local.** Cumple los criterios de aceptación del issue. **Pendiente:** no se ha tocado producción. Falta revisión y despliegue manual (el mu-plugin en prod se sube vía `ssh cat > ruta`, ver `master-feadulta.md`) cuando Rafa lo confirme.
Author
Owner

Cerrado — fix desplegado y verificado en prod

Desplegado en www.feadulta.com (contenedor wordpress-r2ssjifwj0r0ghyoqd528uaa, Hetzner/Coolify), commit c5704d7 de la rama fix/feedback-beta-192. Verificado tras desplegar: php -l sin errores, home 200 con el markup nuevo (fea-fb-error), POST real al endpoint → {"ok":true} (CPT de prueba creado y borrado).

Nota sobre la incidencia original: revisando la BD de prod, el envío de prueba ("Comentario de prueba") sí se guardó — con un typo ("Comentario de prusba", ID 55447, 2026-08-04 12:13:34), por eso la búsqueda del texto exacto no lo encontró. No hubo una caída real del endpoint; los logs de las últimas 26h no muestran ningún fallo de transporte. El fix sigue siendo correcto y útil igualmente (evita que un fallo real de red/HTTP se muestre como éxito), pero no era la causa de lo que parecía una incidencia.

Hallazgo aparte, no relacionado con este issue: el cron diario de WhatsApp (feadulta-feedback-daily) llevaba desde el cutover consultando el servidor CDMON viejo (congelado) en vez de Hetzner — corregido en ~/.hermes/scripts/fea_feedback_last24h.py, fuera del repo de este proyecto.

Rama fix/feedback-beta-192 sigue sin mergear a main (pendiente, arrastra también commits de feat/tts-backlog-autor sin relación).

## Cerrado — fix desplegado y verificado en prod **Desplegado en `www.feadulta.com`** (contenedor `wordpress-r2ssjifwj0r0ghyoqd528uaa`, Hetzner/Coolify), commit `c5704d7` de la rama `fix/feedback-beta-192`. Verificado tras desplegar: `php -l` sin errores, home 200 con el markup nuevo (`fea-fb-error`), POST real al endpoint → `{"ok":true}` (CPT de prueba creado y borrado). **Nota sobre la incidencia original:** revisando la BD de prod, el envío de prueba ("Comentario de prueba") **sí se guardó** — con un typo ("Comentario de **prusba**", ID 55447, 2026-08-04 12:13:34), por eso la búsqueda del texto exacto no lo encontró. No hubo una caída real del endpoint; los logs de las últimas 26h no muestran ningún fallo de transporte. El fix sigue siendo correcto y útil igualmente (evita que un fallo real de red/HTTP se muestre como éxito), pero no era la causa de lo que parecía una incidencia. **Hallazgo aparte, no relacionado con este issue:** el cron diario de WhatsApp (`feadulta-feedback-daily`) llevaba desde el cutover consultando el servidor CDMON viejo (congelado) en vez de Hetzner — corregido en `~/.hermes/scripts/fea_feedback_last24h.py`, fuera del repo de este proyecto. Rama `fix/feedback-beta-192` sigue sin mergear a `main` (pendiente, arrastra también commits de `feat/tts-backlog-autor` sin relación).
rafa closed this issue 2026-08-05 03:20:05 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rafa/feadulta#192