dec-0049

Vista generada de dec-0049: Root cause REAL del leak G4

ImplementadoSin versión del tren todavía· generada desde docs/decisions/dec-0049-root-cause-real-leak-g4.md
track/docsdec-0124track/docs:DC10

Vista generada desde docs/decisions/dec-0049-root-cause-real-leak-g4.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 legadaroot-cause
Ficherodocs/decisions/dec-0049-root-cause-real-leak-g4.md

Enmienda a: r37

Por qué importa (del frontmatter del ADR):

Citado en styx.model.yml (id: r38, status: locked, governedBy: r25), usado por r42 como workaround activo que Cathedral hereda, referenciado en r40 como patrón de lifecycle relevante.

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-0049-root-cause-real-leak-g4.md, el fichero canónico.

Root cause REAL del leak G4

Root cause REAL del leak G4 = ArenaAllocator envolviendo QUIC stack (quiczig_transport.zig init). Los free() de Connection.deinit eran no-ops (arena solo libera en process exit). Fix Styx-side aplicado (arena→GPA) cierra leak post-close sin cambios upstream.

Por qué pasa gate-3

  • Hard-to-reverse: Revertir el fix (volver a arena_alloc) reintroduciría el leak post-close de 891 MB. Es un cambio técnico con evidencia empírica fuerte de corrección (live_bytes 891MB→552KB, rss 790MB→11MB).
  • Surprising sin contexto: Un ingeniero competente leyendo la codebase NO inferiría que un ArenaAllocator envolviendo el QUIC stack convierte los free() en no-ops. La semántica de ArenaAllocator (free = no-op hasta process exit) no es obvia sin contexto.
  • Trade-off real: Alternativa rechazada: intervenir upstream (quic-zig) para corregir el problema. Se elige fix Styx-side (arena→GPA) porque valida la tesis waxin 'arreglar el bug sin nada upstream', es quirúrgico (31 líneas, 1 archivo), y respeta el hard constraint de submodule BUILD-CRITICAL.

Procedencia

Split de docs/decisions/r38-leak-g4-arena-allocator-g4-provisional-2026-06-29.md (lock root-cause) durante PASO 7 (2026-07-16). Ver el fichero padre para el contexto completo del pack original.