Аудит производительности отдельной фичи
Для проекта 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: performance-audit-feature-23description: Точечный аудит производительности и ресурсоёмкости ОДНОЙ конкретной фичи/изменения в the-platform (не всей кодовой базы) — периметр из директории/ветки/diff, документа требований или YouTrack issue; та же дисциплина измерений, что и у полного аудита (EXPLAIN ANALYZE, py-spy, размер бандла, k6), сравнение "до/после" если фича заменяет существующий функционал, явный вердикт готовности к продакшену. Используй когда просят проверить производительность/расход ресурсов конкретной фичи, ветки, PR или YouTrack-задачи перед мержем/релизом, оценить не деградировала ли новая реализация существующий функционал по скорости/ресурсам, или дать зелёный свет по ресурсоёмкости именно для этого изменения — даже без явного слова "аудит", например "не положит ли эта фича базу", "сколько это будет жрать на реальных объёмах", "готова ли эта ветка по производительности".4---56# Аудит производительности отдельной фичи78Для проекта the-platform: микросервисная CRM-платформа — FastAPI +9asyncpg + PostgreSQL + Redis + RabbitMQ бэкенд-сервисы, React/Vite/TS10фронтенд (the-frontend), Docker/Kubernetes/Helm инфраструктура,11нагрузочное тестирование на k6 в `load-testing/`.1213Это точечная версия полного аудита репозитория (см. скилл14`performance-audit-full`, если задача — весь репозиторий, а не одна15фича). Принципы измерения те же, но периметр, находки и отчёт строго16ограничены кодом, который относится к этой фиче и к тому, что она17затрагивает.1819## ВХОДНЫЕ ДАННЫЕ2021Фича: `$ARGUMENTS`2223Промпт универсален по формату входа. В зависимости от того, что передано,24сначала восстанови периметр фичи:2526**A. Директория/ветка/diff** (например27`the-frontend/src/features/leads-import` или "diff между dev и веткой28feature/PROJ-XXXX"):29- Определи затронутые файлы через `git diff --stat` относительно базовой30 ветки (main/dev) либо прочитай содержимое директории целиком, если это31 самостоятельный модуль.32- Определи, какие сервисы/пакеты эти файлы затрагивают (services/*,33 the-frontend, libs/*) — это и есть периметр СРЕЗА 2 ниже.3435**B. Документ с требованиями** (путь к .md/.txt/дизайн-доку и т.п.):36- Прочитай документ целиком, выпиши описанные use cases и ожидаемые37 эндпоинты/экраны/фоновые процессы.38- Найди реализующий эти use cases код в репозитории (grep по именам39 эндпоинтов, роутов, компонентов, названий из документа) — если40 реализация отсутствует или найдена лишь частично, зафиксируй это явно в41 отчёте отдельным пунктом ("не реализовано — тестирование невозможно"),42 не додумывай.4344**C. YouTrack issue** (ID или ссылка):45- Получи текст issue (через доступный YouTrack MCP/API либо попроси46 пользователя вставить текст, если прямого доступа нет) — описание,47 критерии приёмки, связанные коммиты/PR.48- Если в issue или связанных коммитах указаны конкретные файлы/сервисы —49 это периметр; если нет, определи периметр по описанию, как в пункте B, и50 по `git log --grep=<ID>` на предмет связанных коммитов.5152Если ни один из трёх источников не даёт однозначно определить периметр53(неясно, какой код относится к фиче) — остановись и явно перечисли, что54нужно уточнить у автора задачи, вместо того чтобы тестировать наугад весь55сервис целиком.5657## КЛЮЧЕВОЙ ПРИНЦИП: ИЗМЕРЯЙ, А НЕ ДОГАДЫВАЙСЯ5859Компания крайне чувствительна к расходу вычислительных ресурсов (CPU, RAM,60сетевой трафик, стоимость инфраструктуры) — это приоритет первого класса.61Для фичи, которая часто ещё не находилась под реальной нагрузкой, особенно62важно не путать "выглядит нормально на dev-данных" с "выдержит прод-объём".63Придерживайся тех же правил, что и при полном аудите:64651. Для каждой находки, где технически возможно, подтверждай воздействие66 измерением: EXPLAIN ANALYZE для новых/изменённых SQL-запросов,67 профилирование (py-spy/cProfile) для нового CPU-хотспота, реальный68 размер бандла/чанка для нового фронтенд-кода, k6-сценарий (новый или69 расширенный существующий) для нагрузочных характеристик нового/70 изменённого API. Находка без числа — гипотеза; помечай явно как "не71 подтверждено измерением".722. Не предлагай оптимизацию там, где нет доказанной проблемы — три73 одинаковых строки лучше преждевременной абстракции; тот же принцип для74 кэшей и мемоизации в новом коде.753. Явно укажи, при каком объёме данных/нагрузки находка становится76 критичной, учитывая реалистичный рост именно для этой фичи (например:77 импорт лидов — тестируй не на 10 записях, а на объёме, сопоставимом с78 реальным экспортом клиента). Источник для оценки объёма — по79 приоритету: (а) прод-метрики/дашборды, если есть доступ; (б) порядок80 величины из существующих load-testing/reports для того же домена; (в)81 прямой вопрос автору задачи/PM о реальном объёме клиента. Если ни один82 источник недоступен — зафиксируй это как ограничение покрытия (см.83 "методология и ограничения покрытия" в формате отчёта), а не подставляй84 произвольное число.854. Если фича заменяет/модифицирует существующий функционал — проверь, не86 деградировала ли производительность по сравнению с тем, что было87 (сравнение "до/после" обязательно там, где есть с чем сравнивать).88 Технически получи состояние "до": `git worktree add` (или переключение89 на копию базовой ветки) на коммите перед первым коммитом фичи — прогони90 тот же EXPLAIN ANALYZE/профилирование/сборку бандла на этой копии и91 сравни числа напрямую; для отдельного запроса/компонента без поднятия92 окружения достаточно `git show <base-ref>:путь`, чтобы прочитать93 прежнюю реализацию и сравнить её алгоритмически (число запросов,94 сложность) — такое сравнение явно помечай как "не измерено, оценка по95 коду", а не как измеренный результат.965. Формулируй статус явно: "подтверждено измерением" / "правдоподобно, но97 не измерено" / "не является проблемой при текущем объёме данных" / "уже98 оптимизировано корректно".99100## МЕТОДОЛОГИЯ: ТРИ НЕЗАВИСИМЫХ СРЕЗА (в границах периметра фичи)101102### СРЕЗ 1 — Инструментальный анализ и профилирование нового/изменённого кода103104- **Backend**: включи логирование SQL на сценариях именно этой фичи и105 найди N+1/запросы без LIMIT в новом коде; прогони EXPLAIN ANALYZE на106 новых/изменённых запросах; py-spy/cProfile на новых обработчиках, если107 есть подозрение на CPU-хотспот.108- **База данных**: проверь, что новые колонки/фильтры фичи покрыты109 индексами (сверь со схемой миграции, которая эту фичу вводит); если110 фича добавляет новую таблицу — оцени ожидаемый рост и паттерны доступа.111- **Redis/очереди**: если фича вводит новые ключи Redis — есть ли TTL;112 если вводит новую очередь/consumer — prefetch/QoS, DLQ, поведение при113 поллинге внешнего API.114- **Frontend**: если фича добавляет экран/компонент — собери прод-сборку115 и проверь прирост размера бандла/чанка именно от этой фичи (сравни116 размер до/после, если есть базовая точка); проверь наличие117 code-splitting для нового маршрута; прогони Lighthouse (или аналог) по118 новому экрану на предмет LCP/TBT, если можно поднять фронтенд локально.119- **Нагрузочное тестирование**: проверь, есть ли в load-testing/k6120 сценарий, покрывающий новые/изменённые эндпоинты этой фичи. Если нет —121 по возможности напиши минимальный k6-сценарий под эту фичу и прогони122 его (если можно поднять окружение); если сценарий уже есть, прогони и123 сравни с baseline в load-testing/reports.124- **Docker/Helm**: только если фича меняет Dockerfile/values/чарт (новый125 сервис, новая зависимость, изменение resources) — иначе этот пункт не126 применим, явно отметь "не затронуто фичей".127128### СРЕЗ 2 — Ручной построчный разбор кода, затронутого фичей129130Разбери построчно (не по диагонали) весь код, определённый на шаге131"Входные данные" как периметр фичи: новые/изменённые файлы132backend-сервиса(ов), фронтенд-компоненты, изменения в общих библиотеках133(libs/shared_auth, libs/shared_metrics — если фича их трогает, это код,134выполняющийся на каждом запросе каждого сервиса, отнесись с повышенным135вниманием), фоновые обработчики, инфраструктурные конфиги. Используй136детальный чек-лист ниже — выбери из него категории, применимые к типу137фичи (не обязаны совпасть все 12 — например, у чисто фронтенд-фичи не138будет находок по RabbitMQ).139140### СРЕЗ 3 — Влияние фичи на архитектуру и соседние сценарии141142Независимо от построчного разбора оцени:143144- Добавляет ли фича новые синхронные межсервисные хопы в существующие145 частые сценарии (логин, список сделок/лидов, отправка сообщения в чат)146 — посчитай цепочку вызовов до и после появления фичи.147- Если фича переиспользует/дублирует существующий функционал (ещё один148 поллинг того же внешнего API, ещё один кэш для тех же данных) — можно149 ли переиспользовать существующий механизм вместо добавления нового.150- Совместное потребление ресурсов: не создаёт ли фича конкуренцию за то151 же соединение с БД/тот же Redis-инстанс/ту же очередь, что и152 существующая горячая нагрузка.153- Соответствует ли фича общей стратегии кэширования/наблюдаемости154 проекта, или вводит точечное разовое решение в обход неё.155156## ДЕТАЛЬНЫЙ ЧЕК-ЛИСТ ПО КАТЕГОРИЯМ (применяй релевантные фиче пункты)1571581. **Асинхронный backend**: синхронные HTTP-клиенты/I/O внутри async def,159 CPU-тяжёлые операции на event loop без ThreadPoolExecutor/160 ProcessPoolExecutor, последовательные await там, где возможен161 asyncio.gather.1622. **База данных**: N+1 запросы, отсутствующие индексы на новых163 WHERE/JOIN/ORDER BY колонках (особенно user_id/tenant_id/integration_id),164 SELECT * там где нужно 2-3 поля, списковые эндпоинты без пагинации,165 размер пула соединений, долгие транзакции с внешними HTTP-вызовами166 внутри, повторяющиеся идентичные запросы в одном request-response167 цикле.1683. **Кэширование (Redis)**: ключи без TTL, отсутствие кэша для дорогих169 часто повторяющихся вычислений, cache stampede, кэш без инвалидации170 при изменении исходных данных, KEYS/SCAN по всей базе в хот-пасе.1714. **Межсервисное взаимодействие**: отсутствие таймаутов на исходящих172 запросах, отсутствие retry с backoff (или retry без backoff),173 дублирующие вызовы одного сервиса вместо batched-вызова, полная174 пересылка тяжёлых payload там, где нужна часть данных.1755. **Очереди (RabbitMQ) и фоновые обработчики**: prefetch/QoS, poison176 message без DLQ, частота поллинга внешних API относительно реальной177 потребности, размер батча, обработка rate-limit.1786. **Сериализация и размер payload**: избыточные поля в ответах179 Pydantic-моделей, логирование целиком крупных объектов в hot path,180 отсутствие gzip/brotli для крупных JSON-ответов.1817. **Frontend**: прирост размера бандла/чанка, отсутствие182 code-splitting/lazy-loading, лишние ре-рендеры на больших списках183 (виртуализация), waterfall-загрузка данных вместо параллельной,184 слишком частый polling вместо WebSocket/SSE; если фича добавляет новый185 экран/маршрут — сними Lighthouse (или аналог) метрики LCP/TBT для186 него, если можно поднять фронтенд локально.1878. **Docker-образы** (только если фича меняет Dockerfile): размер188 финального образа, отсутствие multi-stage build, избыточный базовый189 образ.1909. **Kubernetes/Helm** (только если фича меняет чарты/values): resources191 requests/limits, интервалы liveness/readiness проб, replicaCount/192 HPA-пороги.19310. **Наблюдаемость**: кардинальность новых метрик/лейблов (user_id/194 request_id как label), сэмплирование трейсов для новых эндпоинтов,195 объём DEBUG-логирования, оставленный в новом коде.19611. **Алгоритмическая эффективность**: квадратичные операции над197 коллекциями, которые фича вводит и которые станут узким местом на198 реальных объёмах, повторный парсинг одних и тех же данных, ненужное199 глубокое копирование, отсутствие батчинга для массовых операций200 (импорт/синк), которые фича добавляет.20112. **Нагрузочное тестирование**: покрывает ли существующий/новый202 k6-сценарий именно эту фичу, зафиксирован ли для неё бюджет203 производительности (максимальная латентность p95, максимальный204 прирост размера бандла).205206## EDGE CASES, ХАРАКТЕРНЫЕ ДЛЯ ФИЧ (а не всего репозитория)207208- Фича работает быстро на пустой/dev-таблице, но не тестировалась на209 объёме, сопоставимом с реальными данными клиента — всегда прикидывай210 реалистичный рост для конкретно этой фичи.211- Фича добавляет вызов уже существующего "дорогого" эндпоинта/запроса в212 новом месте — сама находка была не в фиче, а в том, что фича кратно213 увеличивает частоту вызова уже известной проблемы (проверь, есть ли она214 уже в load-testing/reports или в предыдущем аудите).215- Отладочные флаги/verbose-логирование, оставленные в коде фичи после216 разработки и не отключённые к моменту сдачи.217- Feature flag фичи, из-за которого старый и новый путь работают218 параллельно ("на время миграции") — удваивает нагрузку там, где это не219 единственный путь исполнения.220- Фича, реализованная в общей библиотеке (libs/shared_auth,221 libs/shared_metrics) — даже небольшая неэффективность умножается на222 все сервисы и все реплики, где библиотека подключена, а не только на223 сервис, где фича изначально задумывалась.224- Тесты/бенчмарки фичи гоняются только на happy path с маленьким payload,225 а не на худшем реалистичном случае (максимальный размер файла для226 загрузки, максимальное число элементов в батч-операции, которые фича227 формально допускает).228229## ФОРМАТ ОТЧЁТА2302311. Executive summary (без технического жаргона): готова ли фича по232 производительности к продакшену при ожидаемой нагрузке, что расходует233 ресурсы заметнее всего, что можно исправить без риска для234 функциональности.2352. Вердикт: "готово" / "готово с оговорками (перечислить)" / "не готово —236 критичные находки перечислить" — сформулировать явно, это тестирование237 фичи перед выпуском, а не просто список наблюдений. Правило увязки с238 таблицей KPI (п.3 ниже): хотя бы одна находка severity critical,239 подтверждённая измерением, — вердикт не может быть "готово" (минимум "с240 оговорками", а при риске деградации горячего пути — "не готово");241 критичные находки без подтверждения измерением фиксируй как блокер для242 повторной проверки перед мержем, не занижай severity задним числом,243 чтобы вердикт сошёлся с желаемым результатом.2443. Таблица KPI: число находок по severity (critical/high/medium/low),245 число находок, подтверждённых измерением, vs "правдоподобно, но не246 измерено".2474. Если фича заменяет существующий функционал — сравнение "до/после" по248 ключевым метрикам (латентность, число запросов к БД, размер249 payload/бандла).2505. Полный список находок с привязкой file:line, количественной оценкой251 воздействия (или пометкой "не измерено"), severity, условием при252 котором находка станет критичной, и конкретной рекомендацией по253 исправлению (не "оптимизировать запрос", а "добавить индекс на254 (tenant_id, created_at)").2556. Раздел "что сделано хорошо" в этой фиче — эффективные решения, которые256 стоит тиражировать.2577. План действий: быстрые точечные фиксы без риска регрессии — в первую258 очередь; изменения, требующие тестирования под нагрузкой — во вторую;259 вопросы уровня архитектуры/тимлида (например "не стоило вводить260 отдельный поллинг, есть общий механизм") — отдельным пунктом для261 обсуждения, не как блокер мержа, если явно не critical.2628. Раздел "методология и ограничения покрытия" — какие инструменты/263 измерения использованы, что не удалось протестировать (нет доступа к264 прод-метрикам, нет возможности поднять окружение, нет реалистичного265 объёма тестовых данных) — явно, чтобы отсутствие находок не читалось266 как "всё оптимально".267268## ПРАВИЛА ОФОРМЛЕНИЯ НАХОДОК269270Для каждой находки обязательны: путь к файлу и номер строки; название271проблемы и категория (см. чек-лист); количественная оценка воздействия272(измеренная либо явно помеченная как неизмеренная оценка с обоснованием);273условие, при котором проблема становится критичной; severity с274обоснованием; рекомендация по исправлению, сохраняющая текущее поведение275системы (если оптимизация неизбежно меняет поведение — например,276ужесточение лимита пагинации — отметь это отдельно и явно).277278## ЗАПУСК ТЕСТИРОВАНИЯ (практическая инструкция)279280Делегируй инструментальный разбор и профилирование через Agent tool281отдельному субагенту, а не веди его в основном потоке диалога, если у282тебя есть доступ к Agent tool:2832841. Сначала САМ (в основном потоке) выполни раздел "Входные данные" —285 определи и зафиксируй точный периметр фичи (список файлов/сервисов/286 эндпоинтов). Не делегируй этот шаг: субагент стартует без контекста287 разговора и не знает, что имелось в виду под "фичей". Здесь же проверь288 load-testing/reports и load-testing/ANALYSIS_GUIDE.md на предмет уже289 задокументированных узких мест, которые затрагивает периметр фичи (те290 же эндпоинты/таблицы/сервисы) — это дешёвая проверка, и без неё291 субагент рискует не узнать про уже известную проблему, которую фича292 лишь усиливает частотой вызова (см. EDGE CASES выше), и расследовать293 её заново с нуля.2942. Запусти Agent tool (general-purpose, или Explore для чисто поискового295 под-этапа) с самодостаточным заданием, включающим: определённый на296 шаге 1 периметр (конкретные пути, а не "фича PROJ-XXXX" без расшифровки);297 разделы "Ключевой принцип", "Методология" и "Детальный чек-лист" из298 этого файла; требование вернуть находки в формате раздела "Правила299 оформления находок" и итоговый отчёт по разделу "Формат отчёта".300 Запускай в foreground (`run_in_background: false`), если результат301 нужен для дальнейшего решения в этом же диалоге (например, перед302 мержем) — не продолжай молча, пока агент работает.3033. Если периметр фичи большой (несколько сервисов + фронтенд), рассмотри304 параллельный запуск нескольких субагентов по независимым зонам (СРЕЗ 2305 по backend-сервису(ам) отдельно от СРЕЗ 2 по фронтенду), а СРЕЗ 3306 (архитектурный обзор) — отдельным агентом или самостоятельно, чтобы не307 дать одному агенту "срезать угол" по всему периметру сразу.3084. Если Agent tool недоступен в текущей среде — выполни те же шаги309 последовательно в основном потоке, явно отделяя СРЕЗ 1/2/3 друг от310 друга, и не позволяй результатам одного среза подменять проверку311 другого.3125. Сведи результаты субагента(ов) в единый отчёт по формату выше; если313 несколько субагентов независимо нашли одну и ту же находку — не314 дублируй её в отчёте, но усиль статус подтверждения.3156. Прежде чем объявить фичу готовой, явно проверь раздел "Edge cases,316 характерные для фич" — это типичные слепые зоны именно точечного, а не317 полного аудита.318319Это тестирование, не имплементация: правки вносит разработчик по итогам320отчёта, не ты в рамках этого скилла.321