dec-0056

Vista generada de dec-0056: Lifecycle de buffers

ImplementadoSin versión del tren todavía· generada desde docs/decisions/dec-0056-lifecycle-buffers.md
track/docsdec-0124track/docs:DC10

Vista generada desde docs/decisions/dec-0056-lifecycle-buffers.md. No se edita a mano: bun run docs:gen la regenera y bun run docs:check falla si difiere. El estado aquí es el del model: si discrepa con otra página, manda el model.

CampoValor
EstadoLOCKED (migrado de un rNN por gate-3: el fichero no declara estado)
Referencia legadar40-L5
Ficherodocs/decisions/dec-0056-lifecycle-buffers.md

Enmendado o sustituido por: r46, r60, r61

Por qué importa (del frontmatter del ADR):

native/zig/media-core/source/buffer/lifecycle.zig implementa BufferGuard con estados finished/aborted exactamente como se describe (docstring 'BufferGuard — lifecycle guard for ZeroCopyBuffer (r40 / TKT-016 M5)' línea 1, cita explícita MoQ GroupProducer drop()/abort() línea 3-6). Usado en local_file.zig, moqt_types/server/test.zig, integration_test.zig.

Nodos del roadmap que lo citan en refs: ninguno.

Páginas de la documentación que lo citan: ninguna todavía.

Texto del ADR

Leído de docs/decisions/dec-0056-lifecycle-buffers.md, el fichero canónico.

Lifecycle de buffers

Lifecycle de buffers: clear-on-cancel-sucio, keep-on-finish-limpio (ADAPT from MoQ GroupProducer)

Por qué pasa gate-3

  • Hard-to-reverse: Requiere defer/errdefer en el path de cancel(requestId) para liberar buffers inmediatamente. Cambiar a 'esperar refcount-0 siempre' requeriría modificar el core del lifecycle y podría reintroducir leaks tipo G4 (r36-r38).
  • Surprising sin contexto: Un ingeniero podría esperar que los buffers siempre vivan hasta refcount-0 (GC-style). La distinción 'cancel sucio = liberar ya, finish limpio = conservar' NO es inferible sin el contexto del leak G4 y el patrón MoQ drop()/abort().
  • Trade-off real: Alternativa rechazada implícita: dejar todos los buffers hasta refcount-0 (simple pero propenso a leaks por consumers stale). Trade-off: complejidad de tracking 'cancel sucio vs finish limpio' vs simplicidad de confiar en refcount únicamente. El episodio G4 demostró que leaks son reales sin lifecycle explícito.

Procedencia

Split de docs/decisions/r40-scheduler-cache-mechanics-harvest-2026-06-30.md (lock r40-L5) durante PASO 7 (2026-07-16). Ver el fichero padre para el contexto completo del pack original.