Аудит производительности отдельной фичи
Для проекта the-platform: микросервисная CRM-платформа — FastAPI +
asyncpg + PostgreSQL + Redis + RabbitMQ бэкенд-сервисы, React/Vite/TS
фронтенд (the-frontend), Docker/Kubernetes/Helm инфраструктура,
нагрузочное тестирование на k6 в load-testing/.
Это точечная версия полного аудита репозитория (см. скилл
performance-audit-full, если задача — весь репозиторий, а не одна
фича). Принципы измерения те же, но периметр, находки и отчёт строго
ограничены кодом, который относится к этой фиче и к тому, что она
затрагивает.
ВХОДНЫЕ ДАННЫЕ
Фича: $ARGUMENTS
Промпт универсален по формату входа. В зависимости от того, что передано,
сначала восстанови периметр фичи:
A. Директория/ветка/diff (например
the-frontend/src/features/leads-import или "diff между dev и веткой
feature/PROJ-XXXX"):
- Определи затронутые файлы через
git diff --stat относительно базовой
ветки (main/dev) либо прочитай содержимое директории целиком, если это
самостоятельный модуль.
- Определи, какие сервисы/пакеты эти файлы затрагивают (services/,
the-frontend, libs/) — это и есть периметр СРЕЗА 2 ниже.
B. Документ с требованиями (путь к .md/.txt/дизайн-доку и т.п.):
- Прочитай документ целиком, выпиши описанные use cases и ожидаемые
эндпоинты/экраны/фоновые процессы.
- Найди реализующий эти use cases код в репозитории (grep по именам
эндпоинтов, роутов, компонентов, названий из документа) — если
реализация отсутствует или найдена лишь частично, зафиксируй это явно в
отчёте отдельным пунктом ("не реализовано — тестирование невозможно"),
не додумывай.
C. YouTrack issue (ID или ссылка):
- Получи текст issue (через доступный YouTrack MCP/API либо попроси
пользователя вставить текст, если прямого доступа нет) — описание,
критерии приёмки, связанные коммиты/PR.
- Если в issue или связанных коммитах указаны конкретные файлы/сервисы —
это периметр; если нет, определи периметр по описанию, как в пункте B, и
по
git log --grep=<ID> на предмет связанных коммитов.
Если ни один из трёх источников не даёт однозначно определить периметр
(неясно, какой код относится к фиче) — остановись и явно перечисли, что
нужно уточнить у автора задачи, вместо того чтобы тестировать наугад весь
сервис целиком.
КЛЮЧЕВОЙ ПРИНЦИП: ИЗМЕРЯЙ, А НЕ ДОГАДЫВАЙСЯ
Компания крайне чувствительна к расходу вычислительных ресурсов (CPU, RAM,
сетевой трафик, стоимость инфраструктуры) — это приоритет первого класса.
Для фичи, которая часто ещё не находилась под реальной нагрузкой, особенно
важно не путать "выглядит нормально на dev-данных" с "выдержит прод-объём".
Придерживайся тех же правил, что и при полном аудите:
- Для каждой находки, где технически возможно, подтверждай воздействие
измерением: EXPLAIN ANALYZE для новых/изменённых SQL-запросов,
профилирование (py-spy/cProfile) для нового CPU-хотспота, реальный
размер бандла/чанка для нового фронтенд-кода, k6-сценарий (новый или
расширенный существующий) для нагрузочных характеристик нового/
изменённого API. Находка без числа — гипотеза; помечай явно как "не
подтверждено измерением".
- Не предлагай оптимизацию там, где нет доказанной проблемы — три
одинаковых строки лучше преждевременной абстракции; тот же принцип для
кэшей и мемоизации в новом коде.
- Явно укажи, при каком объёме данных/нагрузки находка становится
критичной, учитывая реалистичный рост именно для этой фичи (например:
импорт лидов — тестируй не на 10 записях, а на объёме, сопоставимом с
реальным экспортом клиента). Источник для оценки объёма — по
приоритету: (а) прод-метрики/дашборды, если есть доступ; (б) порядок
величины из существующих load-testing/reports для того же домена; (в)
прямой вопрос автору задачи/PM о реальном объёме клиента. Если ни один
источник недоступен — зафиксируй это как ограничение покрытия (см.
"методология и ограничения покрытия" в формате отчёта), а не подставляй
произвольное число.
- Если фича заменяет/модифицирует существующий функционал — проверь, не
деградировала ли производительность по сравнению с тем, что было
(сравнение "до/после" обязательно там, где есть с чем сравнивать).
Технически получи состояние "до":
git worktree add (или переключение
на копию базовой ветки) на коммите перед первым коммитом фичи — прогони
тот же EXPLAIN ANALYZE/профилирование/сборку бандла на этой копии и
сравни числа напрямую; для отдельного запроса/компонента без поднятия
окружения достаточно git show <base-ref>:путь, чтобы прочитать
прежнюю реализацию и сравнить её алгоритмически (число запросов,
сложность) — такое сравнение явно помечай как "не измерено, оценка по
коду", а не как измеренный результат.
- Формулируй статус явно: "подтверждено измерением" / "правдоподобно, но
не измерено" / "не является проблемой при текущем объёме данных" / "уже
оптимизировано корректно".
МЕТОДОЛОГИЯ: ТРИ НЕЗАВИСИМЫХ СРЕЗА (в границах периметра фичи)
СРЕЗ 1 — Инструментальный анализ и профилирование нового/изменённого кода
- Backend: включи логирование SQL на сценариях именно этой фичи и
найди N+1/запросы без LIMIT в новом коде; прогони EXPLAIN ANALYZE на
новых/изменённых запросах; py-spy/cProfile на новых обработчиках, если
есть подозрение на CPU-хотспот.
- База данных: проверь, что новые колонки/фильтры фичи покрыты
индексами (сверь со схемой миграции, которая эту фичу вводит); если
фича добавляет новую таблицу — оцени ожидаемый рост и паттерны доступа.
- Redis/очереди: если фича вводит новые ключи Redis — есть ли TTL;
если вводит новую очередь/consumer — prefetch/QoS, DLQ, поведение при
поллинге внешнего API.
- Frontend: если фича добавляет экран/компонент — собери прод-сборку
и проверь прирост размера бандла/чанка именно от этой фичи (сравни
размер до/после, если есть базовая точка); проверь наличие
code-splitting для нового маршрута; прогони Lighthouse (или аналог) по
новому экрану на предмет LCP/TBT, если можно поднять фронтенд локально.
- Нагрузочное тестирование: проверь, есть ли в load-testing/k6
сценарий, покрывающий новые/изменённые эндпоинты этой фичи. Если нет —
по возможности напиши минимальный k6-сценарий под эту фичу и прогони
его (если можно поднять окружение); если сценарий уже есть, прогони и
сравни с baseline в load-testing/reports.
- Docker/Helm: только если фича меняет Dockerfile/values/чарт (новый
сервис, новая зависимость, изменение resources) — иначе этот пункт не
применим, явно отметь "не затронуто фичей".
СРЕЗ 2 — Ручной построчный разбор кода, затронутого фичей
Разбери построчно (не по диагонали) весь код, определённый на шаге
"Входные данные" как периметр фичи: новые/изменённые файлы
backend-сервиса(ов), фронтенд-компоненты, изменения в общих библиотеках
(libs/shared_auth, libs/shared_metrics — если фича их трогает, это код,
выполняющийся на каждом запросе каждого сервиса, отнесись с повышенным
вниманием), фоновые обработчики, инфраструктурные конфиги. Используй
детальный чек-лист ниже — выбери из него категории, применимые к типу
фичи (не обязаны совпасть все 12 — например, у чисто фронтенд-фичи не
будет находок по RabbitMQ).
СРЕЗ 3 — Влияние фичи на архитектуру и соседние сценарии
Независимо от построчного разбора оцени:
- Добавляет ли фича новые синхронные межсервисные хопы в существующие
частые сценарии (логин, список сделок/лидов, отправка сообщения в чат)
— посчитай цепочку вызовов до и после появления фичи.
- Если фича переиспользует/дублирует существующий функционал (ещё один
поллинг того же внешнего API, ещё один кэш для тех же данных) — можно
ли переиспользовать существующий механизм вместо добавления нового.
- Совместное потребление ресурсов: не создаёт ли фича конкуренцию за то
же соединение с БД/тот же Redis-инстанс/ту же очередь, что и
существующая горячая нагрузка.
- Соответствует ли фича общей стратегии кэширования/наблюдаемости
проекта, или вводит точечное разовое решение в обход неё.
ДЕТАЛЬНЫЙ ЧЕК-ЛИСТ ПО КАТЕГОРИЯМ (применяй релевантные фиче пункты)
- Асинхронный backend: синхронные HTTP-клиенты/I/O внутри async def,
CPU-тяжёлые операции на event loop без ThreadPoolExecutor/
ProcessPoolExecutor, последовательные await там, где возможен
asyncio.gather.
- База данных: N+1 запросы, отсутствующие индексы на новых
WHERE/JOIN/ORDER BY колонках (особенно user_id/tenant_id/integration_id),
SELECT * там где нужно 2-3 поля, списковые эндпоинты без пагинации,
размер пула соединений, долгие транзакции с внешними HTTP-вызовами
внутри, повторяющиеся идентичные запросы в одном request-response
цикле.
- Кэширование (Redis): ключи без TTL, отсутствие кэша для дорогих
часто повторяющихся вычислений, cache stampede, кэш без инвалидации
при изменении исходных данных, KEYS/SCAN по всей базе в хот-пасе.
- Межсервисное взаимодействие: отсутствие таймаутов на исходящих
запросах, отсутствие retry с backoff (или retry без backoff),
дублирующие вызовы одного сервиса вместо batched-вызова, полная
пересылка тяжёлых payload там, где нужна часть данных.
- Очереди (RabbitMQ) и фоновые обработчики: prefetch/QoS, poison
message без DLQ, частота поллинга внешних API относительно реальной
потребности, размер батча, обработка rate-limit.
- Сериализация и размер payload: избыточные поля в ответах
Pydantic-моделей, логирование целиком крупных объектов в hot path,
отсутствие gzip/brotli для крупных JSON-ответов.
- Frontend: прирост размера бандла/чанка, отсутствие
code-splitting/lazy-loading, лишние ре-рендеры на больших списках
(виртуализация), waterfall-загрузка данных вместо параллельной,
слишком частый polling вместо WebSocket/SSE; если фича добавляет новый
экран/маршрут — сними Lighthouse (или аналог) метрики LCP/TBT для
него, если можно поднять фронтенд локально.
- Docker-образы (только если фича меняет Dockerfile): размер
финального образа, отсутствие multi-stage build, избыточный базовый
образ.
- Kubernetes/Helm (только если фича меняет чарты/values): resources
requests/limits, интервалы liveness/readiness проб, replicaCount/
HPA-пороги.
- Наблюдаемость: кардинальность новых метрик/лейблов (user_id/
request_id как label), сэмплирование трейсов для новых эндпоинтов,
объём DEBUG-логирования, оставленный в новом коде.
- Алгоритмическая эффективность: квадратичные операции над
коллекциями, которые фича вводит и которые станут узким местом на
реальных объёмах, повторный парсинг одних и тех же данных, ненужное
глубокое копирование, отсутствие батчинга для массовых операций
(импорт/синк), которые фича добавляет.
- Нагрузочное тестирование: покрывает ли существующий/новый
k6-сценарий именно эту фичу, зафиксирован ли для неё бюджет
производительности (максимальная латентность p95, максимальный
прирост размера бандла).
EDGE CASES, ХАРАКТЕРНЫЕ ДЛЯ ФИЧ (а не всего репозитория)
- Фича работает быстро на пустой/dev-таблице, но не тестировалась на
объёме, сопоставимом с реальными данными клиента — всегда прикидывай
реалистичный рост для конкретно этой фичи.
- Фича добавляет вызов уже существующего "дорогого" эндпоинта/запроса в
новом месте — сама находка была не в фиче, а в том, что фича кратно
увеличивает частоту вызова уже известной проблемы (проверь, есть ли она
уже в load-testing/reports или в предыдущем аудите).
- Отладочные флаги/verbose-логирование, оставленные в коде фичи после
разработки и не отключённые к моменту сдачи.
- Feature flag фичи, из-за которого старый и новый путь работают
параллельно ("на время миграции") — удваивает нагрузку там, где это не
единственный путь исполнения.
- Фича, реализованная в общей библиотеке (libs/shared_auth,
libs/shared_metrics) — даже небольшая неэффективность умножается на
все сервисы и все реплики, где библиотека подключена, а не только на
сервис, где фича изначально задумывалась.
- Тесты/бенчмарки фичи гоняются только на happy path с маленьким payload,
а не на худшем реалистичном случае (максимальный размер файла для
загрузки, максимальное число элементов в батч-операции, которые фича
формально допускает).
ФОРМАТ ОТЧЁТА
- Executive summary (без технического жаргона): готова ли фича по
производительности к продакшену при ожидаемой нагрузке, что расходует
ресурсы заметнее всего, что можно исправить без риска для
функциональности.
- Вердикт: "готово" / "готово с оговорками (перечислить)" / "не готово —
критичные находки перечислить" — сформулировать явно, это тестирование
фичи перед выпуском, а не просто список наблюдений. Правило увязки с
таблицей KPI (п.3 ниже): хотя бы одна находка severity critical,
подтверждённая измерением, — вердикт не может быть "готово" (минимум "с
оговорками", а при риске деградации горячего пути — "не готово");
критичные находки без подтверждения измерением фиксируй как блокер для
повторной проверки перед мержем, не занижай severity задним числом,
чтобы вердикт сошёлся с желаемым результатом.
- Таблица KPI: число находок по severity (critical/high/medium/low),
число находок, подтверждённых измерением, vs "правдоподобно, но не
измерено".
- Если фича заменяет существующий функционал — сравнение "до/после" по
ключевым метрикам (латентность, число запросов к БД, размер
payload/бандла).
- Полный список находок с привязкой file:line, количественной оценкой
воздействия (или пометкой "не измерено"), severity, условием при
котором находка станет критичной, и конкретной рекомендацией по
исправлению (не "оптимизировать запрос", а "добавить индекс на
(tenant_id, created_at)").
- Раздел "что сделано хорошо" в этой фиче — эффективные решения, которые
стоит тиражировать.
- План действий: быстрые точечные фиксы без риска регрессии — в первую
очередь; изменения, требующие тестирования под нагрузкой — во вторую;
вопросы уровня архитектуры/тимлида (например "не стоило вводить
отдельный поллинг, есть общий механизм") — отдельным пунктом для
обсуждения, не как блокер мержа, если явно не critical.
- Раздел "методология и ограничения покрытия" — какие инструменты/
измерения использованы, что не удалось протестировать (нет доступа к
прод-метрикам, нет возможности поднять окружение, нет реалистичного
объёма тестовых данных) — явно, чтобы отсутствие находок не читалось
как "всё оптимально".
ПРАВИЛА ОФОРМЛЕНИЯ НАХОДОК
Для каждой находки обязательны: путь к файлу и номер строки; название
проблемы и категория (см. чек-лист); количественная оценка воздействия
(измеренная либо явно помеченная как неизмеренная оценка с обоснованием);
условие, при котором проблема становится критичной; severity с
обоснованием; рекомендация по исправлению, сохраняющая текущее поведение
системы (если оптимизация неизбежно меняет поведение — например,
ужесточение лимита пагинации — отметь это отдельно и явно).
ЗАПУСК ТЕСТИРОВАНИЯ (практическая инструкция)
Делегируй инструментальный разбор и профилирование через Agent tool
отдельному субагенту, а не веди его в основном потоке диалога, если у
тебя есть доступ к Agent tool:
- Сначала САМ (в основном потоке) выполни раздел "Входные данные" —
определи и зафиксируй точный периметр фичи (список файлов/сервисов/
эндпоинтов). Не делегируй этот шаг: субагент стартует без контекста
разговора и не знает, что имелось в виду под "фичей". Здесь же проверь
load-testing/reports и load-testing/ANALYSIS_GUIDE.md на предмет уже
задокументированных узких мест, которые затрагивает периметр фичи (те
же эндпоинты/таблицы/сервисы) — это дешёвая проверка, и без неё
субагент рискует не узнать про уже известную проблему, которую фича
лишь усиливает частотой вызова (см. EDGE CASES выше), и расследовать
её заново с нуля.
- Запусти Agent tool (general-purpose, или Explore для чисто поискового
под-этапа) с самодостаточным заданием, включающим: определённый на
шаге 1 периметр (конкретные пути, а не "фича PROJ-XXXX" без расшифровки);
разделы "Ключевой принцип", "Методология" и "Детальный чек-лист" из
этого файла; требование вернуть находки в формате раздела "Правила
оформления находок" и итоговый отчёт по разделу "Формат отчёта".
Запускай в foreground (
run_in_background: false), если результат
нужен для дальнейшего решения в этом же диалоге (например, перед
мержем) — не продолжай молча, пока агент работает.
- Если периметр фичи большой (несколько сервисов + фронтенд), рассмотри
параллельный запуск нескольких субагентов по независимым зонам (СРЕЗ 2
по backend-сервису(ам) отдельно от СРЕЗ 2 по фронтенду), а СРЕЗ 3
(архитектурный обзор) — отдельным агентом или самостоятельно, чтобы не
дать одному агенту "срезать угол" по всему периметру сразу.
- Если Agent tool недоступен в текущей среде — выполни те же шаги
последовательно в основном потоке, явно отделяя СРЕЗ 1/2/3 друг от
друга, и не позволяй результатам одного среза подменять проверку
другого.
- Сведи результаты субагента(ов) в единый отчёт по формату выше; если
несколько субагентов независимо нашли одну и ту же находку — не
дублируй её в отчёте, но усиль статус подтверждения.
- Прежде чем объявить фичу готовой, явно проверь раздел "Edge cases,
характерные для фич" — это типичные слепые зоны именно точечного, а не
полного аудита.
Это тестирование, не имплементация: правки вносит разработчик по итогам
отчёта, не ты в рамках этого скилла.
1---2name: ru-293description: Точечный аудит производительности и ресурсоёмкости ОДНОЙ конкретной фичи/изменения в the-platform (не всей кодовой базы) — периметр из директории/ветки/diff, документа требований или YouTrack issue; та же дисциплина измерений, что и у полного аудита (EXPLAIN ANALYZE, py-spy, размер бандла, k6), сравнение "до/после" если фича заменяет существующий функционал, явный вердикт готовности к продакшену. Используй когда просят проверить производительность/расход ресурсов конкретной фичи, ветки, PR или YouTrack-задачи перед мержем/релизом, оценить не деградировала ли новая реализация существующий функционал по скорости/ресурсам, или дать зелёный свет по ресурсоёмкости именно для этого изменения — даже без явного слова "аудит", например "не положит ли эта фича базу", "сколько это будет жрать на реальных объёмах", "готова ли эта ветка по производительности".4---5# Аудит производительности отдельной фичи67Для проекта the-platform: микросервисная CRM-платформа — FastAPI +8asyncpg + PostgreSQL + Redis + RabbitMQ бэкенд-сервисы, React/Vite/TS9фронтенд (the-frontend), Docker/Kubernetes/Helm инфраструктура,10нагрузочное тестирование на k6 в `load-testing/`.1112Это точечная версия полного аудита репозитория (см. скилл13`performance-audit-full`, если задача — весь репозиторий, а не одна14фича). Принципы измерения те же, но периметр, находки и отчёт строго15ограничены кодом, который относится к этой фиче и к тому, что она16затрагивает.1718## ВХОДНЫЕ ДАННЫЕ1920Фича: `$ARGUMENTS`2122Промпт универсален по формату входа. В зависимости от того, что передано,23сначала восстанови периметр фичи:2425**A. Директория/ветка/diff** (например26`the-frontend/src/features/leads-import` или "diff между dev и веткой27feature/PROJ-XXXX"):28- Определи затронутые файлы через `git diff --stat` относительно базовой29 ветки (main/dev) либо прочитай содержимое директории целиком, если это30 самостоятельный модуль.31- Определи, какие сервисы/пакеты эти файлы затрагивают (services/*,32 the-frontend, libs/*) — это и есть периметр СРЕЗА 2 ниже.3334**B. Документ с требованиями** (путь к .md/.txt/дизайн-доку и т.п.):35- Прочитай документ целиком, выпиши описанные use cases и ожидаемые36 эндпоинты/экраны/фоновые процессы.37- Найди реализующий эти use cases код в репозитории (grep по именам38 эндпоинтов, роутов, компонентов, названий из документа) — если39 реализация отсутствует или найдена лишь частично, зафиксируй это явно в40 отчёте отдельным пунктом ("не реализовано — тестирование невозможно"),41 не додумывай.4243**C. YouTrack issue** (ID или ссылка):44- Получи текст issue (через доступный YouTrack MCP/API либо попроси45 пользователя вставить текст, если прямого доступа нет) — описание,46 критерии приёмки, связанные коммиты/PR.47- Если в issue или связанных коммитах указаны конкретные файлы/сервисы —48 это периметр; если нет, определи периметр по описанию, как в пункте B, и49 по `git log --grep=<ID>` на предмет связанных коммитов.5051Если ни один из трёх источников не даёт однозначно определить периметр52(неясно, какой код относится к фиче) — остановись и явно перечисли, что53нужно уточнить у автора задачи, вместо того чтобы тестировать наугад весь54сервис целиком.5556## КЛЮЧЕВОЙ ПРИНЦИП: ИЗМЕРЯЙ, А НЕ ДОГАДЫВАЙСЯ5758Компания крайне чувствительна к расходу вычислительных ресурсов (CPU, RAM,59сетевой трафик, стоимость инфраструктуры) — это приоритет первого класса.60Для фичи, которая часто ещё не находилась под реальной нагрузкой, особенно61важно не путать "выглядит нормально на dev-данных" с "выдержит прод-объём".62Придерживайся тех же правил, что и при полном аудите:63641. Для каждой находки, где технически возможно, подтверждай воздействие65 измерением: EXPLAIN ANALYZE для новых/изменённых SQL-запросов,66 профилирование (py-spy/cProfile) для нового CPU-хотспота, реальный67 размер бандла/чанка для нового фронтенд-кода, k6-сценарий (новый или68 расширенный существующий) для нагрузочных характеристик нового/69 изменённого API. Находка без числа — гипотеза; помечай явно как "не70 подтверждено измерением".712. Не предлагай оптимизацию там, где нет доказанной проблемы — три72 одинаковых строки лучше преждевременной абстракции; тот же принцип для73 кэшей и мемоизации в новом коде.743. Явно укажи, при каком объёме данных/нагрузки находка становится75 критичной, учитывая реалистичный рост именно для этой фичи (например:76 импорт лидов — тестируй не на 10 записях, а на объёме, сопоставимом с77 реальным экспортом клиента). Источник для оценки объёма — по78 приоритету: (а) прод-метрики/дашборды, если есть доступ; (б) порядок79 величины из существующих load-testing/reports для того же домена; (в)80 прямой вопрос автору задачи/PM о реальном объёме клиента. Если ни один81 источник недоступен — зафиксируй это как ограничение покрытия (см.82 "методология и ограничения покрытия" в формате отчёта), а не подставляй83 произвольное число.844. Если фича заменяет/модифицирует существующий функционал — проверь, не85 деградировала ли производительность по сравнению с тем, что было86 (сравнение "до/после" обязательно там, где есть с чем сравнивать).87 Технически получи состояние "до": `git worktree add` (или переключение88 на копию базовой ветки) на коммите перед первым коммитом фичи — прогони89 тот же EXPLAIN ANALYZE/профилирование/сборку бандла на этой копии и90 сравни числа напрямую; для отдельного запроса/компонента без поднятия91 окружения достаточно `git show <base-ref>:путь`, чтобы прочитать92 прежнюю реализацию и сравнить её алгоритмически (число запросов,93 сложность) — такое сравнение явно помечай как "не измерено, оценка по94 коду", а не как измеренный результат.955. Формулируй статус явно: "подтверждено измерением" / "правдоподобно, но96 не измерено" / "не является проблемой при текущем объёме данных" / "уже97 оптимизировано корректно".9899## МЕТОДОЛОГИЯ: ТРИ НЕЗАВИСИМЫХ СРЕЗА (в границах периметра фичи)100101### СРЕЗ 1 — Инструментальный анализ и профилирование нового/изменённого кода102103- **Backend**: включи логирование SQL на сценариях именно этой фичи и104 найди N+1/запросы без LIMIT в новом коде; прогони EXPLAIN ANALYZE на105 новых/изменённых запросах; py-spy/cProfile на новых обработчиках, если106 есть подозрение на CPU-хотспот.107- **База данных**: проверь, что новые колонки/фильтры фичи покрыты108 индексами (сверь со схемой миграции, которая эту фичу вводит); если109 фича добавляет новую таблицу — оцени ожидаемый рост и паттерны доступа.110- **Redis/очереди**: если фича вводит новые ключи Redis — есть ли TTL;111 если вводит новую очередь/consumer — prefetch/QoS, DLQ, поведение при112 поллинге внешнего API.113- **Frontend**: если фича добавляет экран/компонент — собери прод-сборку114 и проверь прирост размера бандла/чанка именно от этой фичи (сравни115 размер до/после, если есть базовая точка); проверь наличие116 code-splitting для нового маршрута; прогони Lighthouse (или аналог) по117 новому экрану на предмет LCP/TBT, если можно поднять фронтенд локально.118- **Нагрузочное тестирование**: проверь, есть ли в load-testing/k6119 сценарий, покрывающий новые/изменённые эндпоинты этой фичи. Если нет —120 по возможности напиши минимальный k6-сценарий под эту фичу и прогони121 его (если можно поднять окружение); если сценарий уже есть, прогони и122 сравни с baseline в load-testing/reports.123- **Docker/Helm**: только если фича меняет Dockerfile/values/чарт (новый124 сервис, новая зависимость, изменение resources) — иначе этот пункт не125 применим, явно отметь "не затронуто фичей".126127### СРЕЗ 2 — Ручной построчный разбор кода, затронутого фичей128129Разбери построчно (не по диагонали) весь код, определённый на шаге130"Входные данные" как периметр фичи: новые/изменённые файлы131backend-сервиса(ов), фронтенд-компоненты, изменения в общих библиотеках132(libs/shared_auth, libs/shared_metrics — если фича их трогает, это код,133выполняющийся на каждом запросе каждого сервиса, отнесись с повышенным134вниманием), фоновые обработчики, инфраструктурные конфиги. Используй135детальный чек-лист ниже — выбери из него категории, применимые к типу136фичи (не обязаны совпасть все 12 — например, у чисто фронтенд-фичи не137будет находок по RabbitMQ).138139### СРЕЗ 3 — Влияние фичи на архитектуру и соседние сценарии140141Независимо от построчного разбора оцени:142143- Добавляет ли фича новые синхронные межсервисные хопы в существующие144 частые сценарии (логин, список сделок/лидов, отправка сообщения в чат)145 — посчитай цепочку вызовов до и после появления фичи.146- Если фича переиспользует/дублирует существующий функционал (ещё один147 поллинг того же внешнего API, ещё один кэш для тех же данных) — можно148 ли переиспользовать существующий механизм вместо добавления нового.149- Совместное потребление ресурсов: не создаёт ли фича конкуренцию за то150 же соединение с БД/тот же Redis-инстанс/ту же очередь, что и151 существующая горячая нагрузка.152- Соответствует ли фича общей стратегии кэширования/наблюдаемости153 проекта, или вводит точечное разовое решение в обход неё.154155## ДЕТАЛЬНЫЙ ЧЕК-ЛИСТ ПО КАТЕГОРИЯМ (применяй релевантные фиче пункты)1561571. **Асинхронный backend**: синхронные HTTP-клиенты/I/O внутри async def,158 CPU-тяжёлые операции на event loop без ThreadPoolExecutor/159 ProcessPoolExecutor, последовательные await там, где возможен160 asyncio.gather.1612. **База данных**: N+1 запросы, отсутствующие индексы на новых162 WHERE/JOIN/ORDER BY колонках (особенно user_id/tenant_id/integration_id),163 SELECT * там где нужно 2-3 поля, списковые эндпоинты без пагинации,164 размер пула соединений, долгие транзакции с внешними HTTP-вызовами165 внутри, повторяющиеся идентичные запросы в одном request-response166 цикле.1673. **Кэширование (Redis)**: ключи без TTL, отсутствие кэша для дорогих168 часто повторяющихся вычислений, cache stampede, кэш без инвалидации169 при изменении исходных данных, KEYS/SCAN по всей базе в хот-пасе.1704. **Межсервисное взаимодействие**: отсутствие таймаутов на исходящих171 запросах, отсутствие retry с backoff (или retry без backoff),172 дублирующие вызовы одного сервиса вместо batched-вызова, полная173 пересылка тяжёлых payload там, где нужна часть данных.1745. **Очереди (RabbitMQ) и фоновые обработчики**: prefetch/QoS, poison175 message без DLQ, частота поллинга внешних API относительно реальной176 потребности, размер батча, обработка rate-limit.1776. **Сериализация и размер payload**: избыточные поля в ответах178 Pydantic-моделей, логирование целиком крупных объектов в hot path,179 отсутствие gzip/brotli для крупных JSON-ответов.1807. **Frontend**: прирост размера бандла/чанка, отсутствие181 code-splitting/lazy-loading, лишние ре-рендеры на больших списках182 (виртуализация), waterfall-загрузка данных вместо параллельной,183 слишком частый polling вместо WebSocket/SSE; если фича добавляет новый184 экран/маршрут — сними Lighthouse (или аналог) метрики LCP/TBT для185 него, если можно поднять фронтенд локально.1868. **Docker-образы** (только если фича меняет Dockerfile): размер187 финального образа, отсутствие multi-stage build, избыточный базовый188 образ.1899. **Kubernetes/Helm** (только если фича меняет чарты/values): resources190 requests/limits, интервалы liveness/readiness проб, replicaCount/191 HPA-пороги.19210. **Наблюдаемость**: кардинальность новых метрик/лейблов (user_id/193 request_id как label), сэмплирование трейсов для новых эндпоинтов,194 объём DEBUG-логирования, оставленный в новом коде.19511. **Алгоритмическая эффективность**: квадратичные операции над196 коллекциями, которые фича вводит и которые станут узким местом на197 реальных объёмах, повторный парсинг одних и тех же данных, ненужное198 глубокое копирование, отсутствие батчинга для массовых операций199 (импорт/синк), которые фича добавляет.20012. **Нагрузочное тестирование**: покрывает ли существующий/новый201 k6-сценарий именно эту фичу, зафиксирован ли для неё бюджет202 производительности (максимальная латентность p95, максимальный203 прирост размера бандла).204205## EDGE CASES, ХАРАКТЕРНЫЕ ДЛЯ ФИЧ (а не всего репозитория)206207- Фича работает быстро на пустой/dev-таблице, но не тестировалась на208 объёме, сопоставимом с реальными данными клиента — всегда прикидывай209 реалистичный рост для конкретно этой фичи.210- Фича добавляет вызов уже существующего "дорогого" эндпоинта/запроса в211 новом месте — сама находка была не в фиче, а в том, что фича кратно212 увеличивает частоту вызова уже известной проблемы (проверь, есть ли она213 уже в load-testing/reports или в предыдущем аудите).214- Отладочные флаги/verbose-логирование, оставленные в коде фичи после215 разработки и не отключённые к моменту сдачи.216- Feature flag фичи, из-за которого старый и новый путь работают217 параллельно ("на время миграции") — удваивает нагрузку там, где это не218 единственный путь исполнения.219- Фича, реализованная в общей библиотеке (libs/shared_auth,220 libs/shared_metrics) — даже небольшая неэффективность умножается на221 все сервисы и все реплики, где библиотека подключена, а не только на222 сервис, где фича изначально задумывалась.223- Тесты/бенчмарки фичи гоняются только на happy path с маленьким payload,224 а не на худшем реалистичном случае (максимальный размер файла для225 загрузки, максимальное число элементов в батч-операции, которые фича226 формально допускает).227228## ФОРМАТ ОТЧЁТА2292301. Executive summary (без технического жаргона): готова ли фича по231 производительности к продакшену при ожидаемой нагрузке, что расходует232 ресурсы заметнее всего, что можно исправить без риска для233 функциональности.2342. Вердикт: "готово" / "готово с оговорками (перечислить)" / "не готово —235 критичные находки перечислить" — сформулировать явно, это тестирование236 фичи перед выпуском, а не просто список наблюдений. Правило увязки с237 таблицей KPI (п.3 ниже): хотя бы одна находка severity critical,238 подтверждённая измерением, — вердикт не может быть "готово" (минимум "с239 оговорками", а при риске деградации горячего пути — "не готово");240 критичные находки без подтверждения измерением фиксируй как блокер для241 повторной проверки перед мержем, не занижай severity задним числом,242 чтобы вердикт сошёлся с желаемым результатом.2433. Таблица KPI: число находок по severity (critical/high/medium/low),244 число находок, подтверждённых измерением, vs "правдоподобно, но не245 измерено".2464. Если фича заменяет существующий функционал — сравнение "до/после" по247 ключевым метрикам (латентность, число запросов к БД, размер248 payload/бандла).2495. Полный список находок с привязкой file:line, количественной оценкой250 воздействия (или пометкой "не измерено"), severity, условием при251 котором находка станет критичной, и конкретной рекомендацией по252 исправлению (не "оптимизировать запрос", а "добавить индекс на253 (tenant_id, created_at)").2546. Раздел "что сделано хорошо" в этой фиче — эффективные решения, которые255 стоит тиражировать.2567. План действий: быстрые точечные фиксы без риска регрессии — в первую257 очередь; изменения, требующие тестирования под нагрузкой — во вторую;258 вопросы уровня архитектуры/тимлида (например "не стоило вводить259 отдельный поллинг, есть общий механизм") — отдельным пунктом для260 обсуждения, не как блокер мержа, если явно не critical.2618. Раздел "методология и ограничения покрытия" — какие инструменты/262 измерения использованы, что не удалось протестировать (нет доступа к263 прод-метрикам, нет возможности поднять окружение, нет реалистичного264 объёма тестовых данных) — явно, чтобы отсутствие находок не читалось265 как "всё оптимально".266267## ПРАВИЛА ОФОРМЛЕНИЯ НАХОДОК268269Для каждой находки обязательны: путь к файлу и номер строки; название270проблемы и категория (см. чек-лист); количественная оценка воздействия271(измеренная либо явно помеченная как неизмеренная оценка с обоснованием);272условие, при котором проблема становится критичной; severity с273обоснованием; рекомендация по исправлению, сохраняющая текущее поведение274системы (если оптимизация неизбежно меняет поведение — например,275ужесточение лимита пагинации — отметь это отдельно и явно).276277## ЗАПУСК ТЕСТИРОВАНИЯ (практическая инструкция)278279Делегируй инструментальный разбор и профилирование через Agent tool280отдельному субагенту, а не веди его в основном потоке диалога, если у281тебя есть доступ к Agent tool:2822831. Сначала САМ (в основном потоке) выполни раздел "Входные данные" —284 определи и зафиксируй точный периметр фичи (список файлов/сервисов/285 эндпоинтов). Не делегируй этот шаг: субагент стартует без контекста286 разговора и не знает, что имелось в виду под "фичей". Здесь же проверь287 load-testing/reports и load-testing/ANALYSIS_GUIDE.md на предмет уже288 задокументированных узких мест, которые затрагивает периметр фичи (те289 же эндпоинты/таблицы/сервисы) — это дешёвая проверка, и без неё290 субагент рискует не узнать про уже известную проблему, которую фича291 лишь усиливает частотой вызова (см. EDGE CASES выше), и расследовать292 её заново с нуля.2932. Запусти Agent tool (general-purpose, или Explore для чисто поискового294 под-этапа) с самодостаточным заданием, включающим: определённый на295 шаге 1 периметр (конкретные пути, а не "фича PROJ-XXXX" без расшифровки);296 разделы "Ключевой принцип", "Методология" и "Детальный чек-лист" из297 этого файла; требование вернуть находки в формате раздела "Правила298 оформления находок" и итоговый отчёт по разделу "Формат отчёта".299 Запускай в foreground (`run_in_background: false`), если результат300 нужен для дальнейшего решения в этом же диалоге (например, перед301 мержем) — не продолжай молча, пока агент работает.3023. Если периметр фичи большой (несколько сервисов + фронтенд), рассмотри303 параллельный запуск нескольких субагентов по независимым зонам (СРЕЗ 2304 по backend-сервису(ам) отдельно от СРЕЗ 2 по фронтенду), а СРЕЗ 3305 (архитектурный обзор) — отдельным агентом или самостоятельно, чтобы не306 дать одному агенту "срезать угол" по всему периметру сразу.3074. Если Agent tool недоступен в текущей среде — выполни те же шаги308 последовательно в основном потоке, явно отделяя СРЕЗ 1/2/3 друг от309 друга, и не позволяй результатам одного среза подменять проверку310 другого.3115. Сведи результаты субагента(ов) в единый отчёт по формату выше; если312 несколько субагентов независимо нашли одну и ту же находку — не313 дублируй её в отчёте, но усиль статус подтверждения.3146. Прежде чем объявить фичу готовой, явно проверь раздел "Edge cases,315 характерные для фич" — это типичные слепые зоны именно точечного, а не316 полного аудита.317318Это тестирование, не имплементация: правки вносит разработчик по итогам319отчёта, не ты в рамках этого скилла.