---
name: mass-code-deletion-ast-only
description: "Правило для любого проекта — массовое удаление функций/методов только через AST lineno/end_lineno, никогда вручную по диапазону строк или текстовым маркерам-соседям"
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 805ead91-dfa3-49d2-a5e6-01a980e715fd
  modified: 2026-07-29T21:25:36.169Z
---

При удалении "мёртвого кода" по диапазону вроде «от def start() до def
shutdown()» line-range-скрипт снёс 3 ЖИВЫХ метода, физически лежавших
между ними — они не были частью того, что реально требовалось удалить,
но попали в диапазон чисто из-за расположения в файле. Немедленный краш
прод-бота при рестарте ([[vakhunter_full_audit_2026-07]]).

**Why:** ручное определение границ по соседним def/маркерам предполагает
порядок методов в файле совпадает с логическим намерением автора
удаления — это неверное допущение почти всегда, когда файл жил долго и
методы дописывались в произвольном месте класса.

**How to apply:** любое массовое (>1 функции/метода за раз) удаление
кода — сначала `ast.parse(src)`, найти точный `lineno`/`end_lineno`
каждой удаляемой функции по ИМЕНИ (не по позиции в файле), удалить
диапазоны от конца к началу файла (чтобы не сдвигать ещё не обработанные
номера строк), затем ОБЯЗАТЕЛЬНО сверить полный список def/async-def
имён до и после (`comm -23` двух отсортированных списков) — единственная
разница должна быть ровно тем, что собирались удалить. Это работает
одинаково в любом Python-проекте, не только VakHunter.
