feat(skills): добавлен скилл cross-review для ревью моделью другого семейства
- Зачем: два плейбука оркестрации разошлись, а из них на практике нужно только независимое ревью моделью другого семейства. - Что: линзы для ревьюера (по задаче, по коду, форма и вкус, вычитание, план), общий мандат и перепроверка; разбор находок остаётся у автора. Механика запуска вынесена в адаптеры: T3 Code, codex exec, claude -p. Следующие круги ревью идут продолжением сессии того же ревьюера. Старые плейбуки пока не удалены. - Проверка: запуск, запись отчёта и продолжение сессии прогнаны на codex-cli 0.163.0, Claude Code 2.1.302 и в T3 Code; два круга ревью скилла (gpt-6.1-sol, gpt-6-astra), находки исправлены; ссылки и YAML проверены скриптом. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
144bc2515b
commit
158075e059
12 files changed
+658
No files matched your search
@@ -0,0 +1,61 @@
|
||||
## Линза: форма и вкус
|
||||
|
||||
Сильный исполнитель ошибается не в отделке кода, а в форме решения — в тех
|
||||
решениях, которые постановка оставила открытыми. Чистый код такие ошибки
|
||||
прячет, поэтому начни с формы, ещё до чтения изменённых файлов.
|
||||
|
||||
1. По одной постановке набросай ожидаемую форму решения: какое вычисление
|
||||
где живёт, что и примерно в каком объёме пересекает границы процессов и
|
||||
хранилищ, какие артефакты должны появиться. Хватит нескольких строк.
|
||||
Это гипотеза, а не образец, которому код обязан следовать.
|
||||
2. Прочитай изменения и выпиши решения, которых постановка не требовала:
|
||||
где размещены вычисления, какие данные идут через границы, какие
|
||||
появились новые сущности, что сделано сверх просьбы.
|
||||
3. Каждое расхождение с наброском и каждое такое решение оцени по
|
||||
соглашениям репозитория, по риску и по размеру задачи. Формально верное,
|
||||
но по сути неправильное — тоже находка: работа не по масштабу задачи,
|
||||
артефакт, который не оправдывает своего существования, проверка, которая
|
||||
проходит, ничего не доказывая.
|
||||
|
||||
Набросок и список решений приведи в отчёте как выполненные проверки, даже
|
||||
если находок нет.
|
||||
|
||||
### Глубина модулей
|
||||
|
||||
Глубокий модуль прячет много поведения за маленьким интерфейсом. Мелкий
|
||||
заставляет вызывающего узнать почти столько же, сколько сам экономит.
|
||||
Отмечай новые мелкие модули, слои, которые только передают вызов дальше, и
|
||||
точки расширения с единственной реализацией, у которой не видно второй.
|
||||
|
||||
### Запахи кода
|
||||
|
||||
Оценивай находку о вкусе по цене жизни с этим кодом, а не по тому, ломает
|
||||
ли она тест. Сверяй изменение с этим списком (Фаулер, «Рефакторинг», гл. 3).
|
||||
Записанное соглашение репозитория важнее списка. Любой запах — повод для
|
||||
суждения («возможно, Feature Envy»), а не нарушение правила. Пропускай то,
|
||||
что уже проверяют линтеры и форматтеры.
|
||||
|
||||
- **Mysterious Name** — имя скрывает, что делает или хранит сущность →
|
||||
переименуй; если честное имя не находится, мутно само устройство.
|
||||
- **Duplicated Code** — одна и та же логика в нескольких местах → вынеси её
|
||||
и вызывай из обоих.
|
||||
- **Feature Envy** — функция работает с чужими данными больше, чем со
|
||||
своими → перенеси её к данным.
|
||||
- **Data Clumps** — одни и те же несколько полей или параметров всё время
|
||||
ходят вместе → собери их в один тип.
|
||||
- **Primitive Obsession** — строка или число заменяют понятие предметной
|
||||
области → дай понятию свой маленький тип.
|
||||
- **Repeated Switches** — один и тот же выбор по типу повторяется → полиморфизм
|
||||
или одна таблица соответствий на оба места.
|
||||
- **Shotgun Surgery** — одно логическое изменение требует правок по многим
|
||||
файлам → собери то, что меняется вместе, в один модуль.
|
||||
- **Divergent Change** — один модуль правят по несвязанным причинам →
|
||||
раздели так, чтобы каждая часть менялась по одной причине.
|
||||
- **Speculative Generality** — абстракции, параметры или крючки для нужд,
|
||||
которых у задачи нет → удали; встрой обратно, пока нужда не появится.
|
||||
- **Message Chains** — длинные цепочки `a.b().c().d()` → спрячь обход за
|
||||
одним методом первого объекта.
|
||||
- **Middle Man** — модуль в основном передаёт вызовы дальше → вызывай
|
||||
настоящую цель напрямую.
|
||||
- **Refused Bequest** — наследник почти не пользуется тем, что унаследовал →
|
||||
откажись от наследования в пользу композиции.
|
||||
Reference in new issue
Block a user