Пятнадцать параллельных сессий Claude Code — это не пятнадцать вкладок терминала. Это флот процессов: у каждой сессии свой MCP-сервер, свои дочерние процессы, свой аппетит к памяти. И следить за этим флотом не обязан никто, кроме тебя — а следить за пятнадцатью вещами одновременно человек не умеет.
Я нашёл утечку случайно. Разбирал совсем другую проблему — Obsidian падал при открытии vault’а — и по пути заметил, что вентилятор Mac молотит без остановки. Причина оказалась не в Obsidian: один headless-браузер Playwright, поднятый MCP-сервером ещё три дня назад, залип на ~95% одного ядра и с тех пор просто не отпускал его. Никакого краша, никакой ошибки в логах — процесс тихо работал, пока я случайно не наткнулся на него через ps aux. Рядом обнаружился ещё десяток таких же MCP-серверов в состоянии покоя — не текущая проблема, но тот же структурный риск: одна забытая сессия — один потенциальный такой процесс.
Второй слой оказался интереснее первого. Я стал добавлять автоматический мониторинг — фоновая проверка каждые 25 минут: сколько сессий живо, сколько простаивает, не завис ли где-то процесс. Первая версия ставила пороги по свопу и свободной памяти — казалось бы, разумно: своп под 90% — тревога. Но на этой машине своп под 90%, а свободная память в десятках мегабайт — это не авария, а обычное рабочее состояние при таком количестве одновременных агентов. С такими порогами монитор орал бы постоянно — и через неделю я бы перестал его читать. Ровно то же самое, из-за чего утечка простояла три дня незамеченной: сигнал, который выглядит как норма, тонет в потоке, который тоже выглядит как норма.
Пришлось выкинуть абсолютные пороги и считать относительное: не «сколько свопа занято», а «насколько он вырос за последние 25 минут»; не «какая нагрузка сейчас», а «выросла ли она резко относительно своего же пятнадцатиминутного среднего». Мониторинг живых процессов, наоборот, остался жёстким — если один процесс час за часом ест 85% ядра, это не может быть нормой ни при какой базовой линии.
Урок один и тот же на обоих уровнях: если алерт срабатывает на состоянии, которое и так всегда такое, он бесполезен — не потому что неточен, а потому что его перестают читать. Отличать сигнал нужно не от тишины, а от привычного фонового шума конкретной системы.