Git log как датасет для архитектурного ретроанализа | Григорий Добряков

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

Howto · разбор

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

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

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

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-исключения). Из конкретных выводов прогона:

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

Где ломается

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

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

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

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

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

Об авторе

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

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

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

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

Ещё разборы

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

К серии →