ревью двумя проходами: 20 находок, все починены
Два независимых сабагента на av-dev-pm и av-dev-pipeline. Две находки нашли оба. Главная — моя же перестановка закрытия за коммит сломала reopen и батч. close печатал «дорога назад из git», а reopen искал коммит удаления, которого в новом порядке ещё нет: шаг 11 последний, учёт остаётся незакоммиченным. Проверено прогоном — отказ кодом 2 на свежезакрытой задаче. Тем же грязным деревом ломались rebase и worktree remove в батче: каждая закрывшая задачу ветка уехала бы в провалившиеся. Починено с обеих сторон: reopen берёт текст из HEAD, если коммита удаления нет, а шаг 11 коммитит учёт вторым коммитом. Вторая — канонический пример docs/.pm.json убивал tasks.py. Четыре документа показывали ключ tasks.sections, которого скрипт не знает: неизвестный ключ это код 3 на любой команде. Проект, заведённый по канону дословно, остался бы без работы с задачами, а docs.py при этом печатал «канон соблюдён». Секции живут в заголовках индекса и второго дома не получают. Остальные восемнадцать: init писал конфиг в упразднённый .tasks.json; looks_like_tasks не видел переименованный индекс; урожай спринта терял автотег после sprint close; ответ на вопрос по инструкции оставлял задачу незабираемой; adopt требовал недостижимого зелёного; путь отчёта триажа не переживал archive; review-specs не имел режима для стыка после слияния; три остатка «шаг 9а» несли предкоммитную позицию закрытия; sprint.md отрицал сам себя в пункте «Сделана». Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -759,3 +759,53 @@ pyrefly: в окружении нет ничего, кроме линтеров,
|
||||
43. **Проверка не входит ни в один гейт.** CI у репозитория нет, хука нет;
|
||||
запускается руками командой из README. Заводить хук ради двух скриптов,
|
||||
которые правятся раз в месяц, — плата ритуалом без выгоды.
|
||||
|
||||
## 10. Ревью готовых плагинов двумя проходами (2026-08-03)
|
||||
|
||||
### Что было
|
||||
|
||||
Два независимых сабагента `fable` — по одному на `av-dev-pm` и `av-dev-pipeline`.
|
||||
**20 находок, из них две найдены обоими независимо.** Прошлые три круга ревью
|
||||
шли по одному проходу на всё; два прохода с разными предметами дали и больший
|
||||
урожай, и перекрёстное подтверждение самого дорогого дефекта.
|
||||
|
||||
### Что оказалось сломано по существу
|
||||
|
||||
**JJ. Перестановка закрытия за коммит (решение из темы 8) сломала `reopen` и
|
||||
батч — и это нашли оба прохода.** `close --implemented` печатает «дорога назад:
|
||||
файл восстанавливается из git», а `reopen` искал **коммит удаления**, которого в
|
||||
новом порядке ещё нет: шаг 11 идёт последним, и учёт остаётся незакоммиченным.
|
||||
Проверено прогоном: `reopen` отказывал кодом 2 на свежезакрытой задаче — то есть
|
||||
в самом вероятном своём применении. Тем же грязным деревом ломался `task-batch`:
|
||||
`git rebase` и `git worktree remove` отказывают, и **каждая успешно закрывшая
|
||||
задачу ветка** уезжала бы в провалившиеся.
|
||||
|
||||
Починено с обеих сторон: `reopen` берёт текст из `HEAD`, если коммита удаления
|
||||
нет, а шаг 11 обязан **коммитить учёт вторым коммитом** — иначе закрытие не
|
||||
доезжает до основной ветки и опора «`SPRINT.md` под git» остаётся словами.
|
||||
|
||||
**KK. Канонический пример `docs/.pm.json` убивал `tasks.py`.** `canon.md`,
|
||||
`skeletons.md`, `tasks/SKILL.md` и `adopt.md` показывали ключ `tasks.sections`,
|
||||
которого скрипт не знает: `_validate_config` отвергает неизвестные ключи кодом 3
|
||||
на **любой** команде. Проект, заведённый по канону дословно, остался бы без
|
||||
работы с задачами целиком — а `docs.py check` при этом печатал «канон соблюдён»,
|
||||
потому что чужой код 3 уходит в «не проверялось». Секции живут в заголовках `##`
|
||||
индекса и второго дома не получают.
|
||||
|
||||
### Что из этого следует
|
||||
|
||||
44. **Класс находок тот же, что и в прошлые три круга: стыки.** Не новый код, а
|
||||
место, где один файл ссылается на другой. `sprint.md` в пункте «Сделана» всё
|
||||
ещё отсылал к порядку, который сам же тремя экранами ниже отменил; три
|
||||
остатка «шаг 9а» несли **предкоммитную** позицию закрытия; путь отчёта
|
||||
триажа не переживал `opsx:archive`, хотя по нему сверяют полноту ревью
|
||||
четверо.
|
||||
45. **Инструкция, которую нельзя выполнить, выглядит как выполненная.** Ответ на
|
||||
вопрос по документированной процедуре (снять тег) оставлял задачу
|
||||
незабираемой, потому что судит **раздел**, а не тег; `canon adopt` требовал
|
||||
гнать `docs.py check` «до отсутствия дрейфа», недостижимого без нарушения
|
||||
запрета сочинять цели; урожай спринта, заведённый после `sprint close`,
|
||||
терял автотег молча.
|
||||
46. **Два прохода по разным предметам дороже одного, но не вдвое.** Перекрытие
|
||||
оказалось ровно в одной находке из двадцати — той самой, что подтвердилась
|
||||
дважды. Практика остаётся: ревью на плагин, а не одно на репозиторий.
|
||||
|
||||
Reference in New Issue
Block a user