Skip to content

[F4-06] Reintentos, errores clasificados y cancelación #67

Open

Description

@JCCG-code

Fase: F4 · Tamaño: M · Depende de: #60 (F4-03), #61 (F4-04), #62 (F4-05)

Objetivo

Que los fallos pasajeros se recuperen solos, que los definitivos se expliquen con claridad y que el usuario pueda parar un proyecto en cualquier momento sin seguir gastando.

Alcance

  • Reintentos: 3 intentos con backoff exponencial para rate_limit, timeout, unavailable y errores de red, respetando retryAfterMs. auth, safety, quota e invalid_request no se reintentan (UnrecoverableError de BullMQ).
  • Mensajes: cada code tiene un texto para el usuario en es/en con la acción sugerida (p. ej. auth → "tu clave de OpenAI no es válida: revísala en Ajustes"; safety → "el proveedor bloqueó esta escena: edita su prompt y regenera").
  • Cancelación: POST /projects/:id/cancel pone el proyecto en cancelled; los trabajos en cola se descartan y los activos reciben un AbortSignal (adaptadores y FFmpeg paran) y quedan cancelled.
  • Fallo del proyecto: si un paso falla de forma definitiva, el proyecto pasa a failed y no se ejecuta nada más que dependa de él.
  • Reintento manual: POST /projects/:id/steps/:step/retry y POST /projects/:id/scenes/:n/retry vuelven a poner el paso en pending y llaman a advance.

Criterios de aceptación

  • Test con fake: dos rate_limit seguidos y después éxito → el paso termina succeeded con attempts = 3.
  • Test: safety en imagen → la escena queda failed tras 1 intento, con mensaje traducido.
  • Test: cancelar durante el montaje mata FFmpeg en < 2 s y el proyecto queda cancelled; no se llama a ningún proveedor después.
  • Test: reintentar manualmente una escena fallida y después el montaje deja el proyecto completed.

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions