Skip to content

[Relay][P0] Propagar cancelación y reanudar solicitudes sin duplicar efectos #46

Description

@0bkevin

Contexto auditado

T3 Code separa requests finitos, subscriptions durables y commands; el supervisor sustituye sesiones y sus tests exigen metadata idempotente para commands en cola. Referencia: Connection Runtime.

Brecha actual

En Brio, abortar en Mobile solo elimina el promise local en brio.ts. El Relay no acepta frame cancel; conserva la entrada pendiente hasta terminal/disconnect/TTL. El connector ejecuta cada handler con el contexto global de la conexión, así que no cancela Hermes cuando un request individual se abandona. Si la red cae, no hay ACK, cursor, resume ni definición de retry seguro; reenviar una mutación puede duplicar efectos.

Propuesta

  1. Versionar el protocolo con request, accepted/ack, cancel, terminal y resume.
  2. Separar frame_id de un operation_id/idempotency key estable.
  3. Relay debe reenviar cancel y liberar pending; connector debe guardar un cancel func por operación y propagarlo a Hermes.
  4. Definir qué operaciones son retryable, idempotentes o “resultado desconocido”; nunca reintentar mutaciones a ciegas.
  5. Para streams, persistir/usar sequence cursor y reanudar desde el último ACK sin duplicar chunks/eventos.
  6. Permitir consultar el resultado terminal por operation ID durante una ventana acotada.
  7. Limpiar estado en terminal, expiración, unlink, revocación y disconnect; aplicar budgets por device/agent.
  8. Añadir errores estructurados: cancelled, expired, duplicate, result_unknown y resume_unavailable.

Criterios de aceptación

  • Cancelar desde Mobile detiene el trabajo upstream y libera los tres niveles: Mobile, Relay y connector.
  • Un disconnect tras ACK no duplica una mutación al reconectar.
  • Un stream reanudado no pierde ni repite eventos y conserva orden.
  • Dos frames con el mismo operation ID devuelven el mismo resultado o un conflicto definido.
  • El estado retained tiene TTL y límites; no crece sin cota.
  • Tests cubren carreras cancel/terminal, reconnect antes/después de ACK, replacement de connector, expiración, backpressure y multi-device.

Complementa #3 (transporte en tiempo real) y #4 (contrato versionado).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions