Григорий Добряков

Howto · разбор

Разбор 17 Architecture Audit LLM + Metrics Hybrid

Git log как датасет для архитектурного ретроанализа

Git log как датасет — это приём архитектурного ретроанализа: история коммитов читается как данные, чтобы восстановить контекст прошлых решений в проекте из десятков модулей. Видно объективно, что рефакторилось, что умерло без решения и что слиплось без намерения.

Architect Tech Lead Head of AI

Проблема

При долгой разработке проекта из десятков скиллов, сервисов или модулей теряется контекст принятия прошлых архитектурных решений. Подходы менялись, что-то рефакторилось, что-то умерло без явного решения, что-то слиплось без явного намерения. Чтобы увидеть это объективно, нужен датасет, который не зависит от человеческой памяти.

Такой датасет уже есть — это git-история. Проблема не в его отсутствии, а в том, что им редко пользуются как датасетом. Обычно его читают как ленту коммитов («что было в этом месяце»), реже — как метрику (churn, co-change). И почти никогда — как материал для интерпретации.

Сразу оговорка про что это не. Это не «скормить git log в LLM и получить инсайт». Так не работает: на месячной истории среднего репо дифф — это десятки мегабайт текста, в один промпт не лезет; и даже если бы лез, LLM на сыром логе склонна к нарративной гладкости — найдёт «эволюцию» и «переломы» там, где их нет.

Это и не code-maat-подобный подход (одни количественные метрики). Метрики дают факт, но не объяснение. «Компонент X переписывали 16 раз» — факт. Был ли это поиск формы, реакция на изменение требований или признак неудачного дизайна — числа не скажут.

Запрос: получить объяснение, основанное на числах, а не нарратив без основания и не цифру без интерпретации.

Методика

Один принцип: разделить метрический слой и интерпретационный. Метрики считаются детерминированно, поверх них LLM пишет нарративный отчёт. Каждое утверждение в отчёте обязано ссылаться либо на конкретный SHA коммита, либо на число из метрик. Это снимает риск выдуманных паттернов: если LLM сказала «компонент А связан с Б», должно быть co_commits ≥ 2 и SHA коммитов, где они вместе. Иначе утверждение не появляется в отчёте.

Слой 1 — метрики (скрипт, bash + awk)

Один скрипт принимает --root <path>, --since <date>, --until <date>, --bulk-threshold K и выдаёт JSON из трёх блоков:

Bulk-фильтр: коммит, тронувший больше K компонентов (дефолт 5), помечается is_bulk=true и исключается из co-change матрицы. Иначе один-два cross-cutting рефактора («обновил формат во всех скиллах») перекосят матрицу настолько, что любая пара из задействованных компонентов будет выглядеть связанной. Per-component churn такие коммиты всё же набирают — это реальная работа, просто не семантический сигнал сцепленности.

Никаких зависимостей: git + bash + awk. Read-only.

Слой 2 — детерминированный отбор коммитов

LLM не выбирает, что смотреть. Правила фиксированы:

Объединение трёх множеств идёт в полный дифф через git show -p. Если суммарный объём диффов превышает бюджет (~200K токенов), скилл обрезает с конца отсортированного по дате списка и в отчёте пишет об обрезке.

Слой 3 — интерпретация (LLM)

Имея метрики JSON + полные диффы отобранных коммитов, LLM пишет отчёт по жёсткой структуре: scope → метрики → co-change → переломы → парадоксы → эволюция подхода → что напрашивается → ограничения.

Правила интерпретации:

Что это даёт

  1. 1. Воспроизводимость. На одном и том же git state скрипт даёт идентичный JSON. Метрики — факт. Интерпретация поверх — мнение LLM, и оно явно подписано как мнение (со ссылками на источник).
  2. 2. Локализация ошибки. Числа кривые — баг в скрипте, чинится тестом. Нарратив кривой — LLM нагалюцинировала, фиксится правкой инструкции.
  3. 3. Bulk-фильтр прозрачен. Исключённые коммиты не пропадают — они названы в отчёте отдельной секцией. Видно, что было решено выкинуть и почему.
  4. 4. Метрики переиспользуемы. Скрипт работает без LLM-слоя — для CI, дашборда, сравнения двух запусков. Бонус, не цель.

Артефакт

Скилл git-evolution-audit — публичный репозиторий: github.com/dobryakov/git-evolution-audit.

Один реальный прогон сделан на .claude/skills/ этого репо за период 2026-04-27..2026-05-22 (62 коммита, 19 компонентов, 2 bulk-исключения). Из конкретных выводов прогона:

Все эти выводы пришли из чисел, не из «общих соображений». Это и есть проверка методики на собственном репо.

Series signature

Где ломается

Для кого и почему

Architect, tech lead, head of AI — те, кто строит долгоживущие системы и хочет периодически получать объективное зеркало того, что в них происходит.

Особенно полезно — для систем со скиллами/агентами/LLM-пайплайнами, где «как развивался компонент» сложнее ответить, чем для классического кода: скиллы часто переписываются итеративно, разделение между «методология» и «реализация» размыто, и без специального инструмента состояние через квартал восстановить тяжело.

Главное, что закрывает паттерн: subjective drift — когда мнение о собственной архитектуре расходится с её реальным состоянием. Метрики не дают забыть, что было переписано пять раз; интерпретация поверх не даёт утонуть в одних числах. Гибрид работает лучше каждого слоя по отдельности.

Это не замена ревью или ретроспективы; это дешёвый промежуточный артефакт, который можно прогонять ежеквартально на любом критичном каталоге и хранить как baseline. Через квартал — следующий прогон, видна дельта без специальных инструментов.

Об авторе

Григорий Добряков — AI-Driven Head of Engineering

Нужно такое зеркало для вашего кода?

Архитектурные аудиты, опирающиеся на числа, а не на ощущения. Governance скиллов, AI-driven engineering practices, выдерживающие квартальный пересмотр.

Написать письмо

Ещё разборы

Серия инженерных разборов: реальная задача → методика → работающий артефакт → честный анализ того, где он ломается.

К серии →