resync.py поднят в scripts/: пересборка копий из домов
copies.py находит расхождение, а чинить его руками — та же работа, из-за которой копии и расходятся: правка дома касается стольких файлов, сколько у него копий, и последний забывают. Проверка была, починки не было. Разметку разбирает не свой код: copies.py импортируется целиком, иначе второй разборщик той же разметки разошёлся бы с первым молча. В гейт не ставится намеренно. Автоматическая пересборка протащила бы правку дома во все копии мимо глаз автора, а копия, уезжающая в репозиторий проекта, тянет ещё и запись в журнал версий канона — этого машина не напишет. Проверено на обеих формах копии: обычной и лежащей внутри объемлющей ограды. Ограда и пустые строки по краям принадлежат месту, а не дому, и пересборка возвращает их такими, какими были — round-trip побайтно чистый на всех 24 копиях.
This commit is contained in:
@@ -262,7 +262,7 @@ claude plugin uninstall <плагин>@av-dev-skills --scope project
|
||||
<plugin>/skills/<skill>/scripts/ tasks.py, docs.py, openspec.py
|
||||
<plugin>/agents/ charter'ы сабагентов
|
||||
shared/ дома правил, общих для нескольких плагинов
|
||||
scripts/ проверки репозитория: копии, адреса, диаграммы, фронтматтеры
|
||||
scripts/ проверки репозитория и пересборка копий
|
||||
pyproject.toml линтеры скриптов, только для этого репозитория
|
||||
lefthook.yml гейт коммита: проверки документов
|
||||
```
|
||||
@@ -355,6 +355,32 @@ uv run python scripts/copies.py # 0 сошлось, 1 расхождение
|
||||
на тот файл, дом остался без копий, разметка сломана. Чего он **не** ловит —
|
||||
копию, которую забыли пометить: помечать — по-прежнему решение человека.
|
||||
|
||||
### Пересборка — `scripts/resync.py`
|
||||
|
||||
```
|
||||
python3 scripts/resync.py # переписать тела всех разошедшихся копий из домов
|
||||
# 0 готово, 2 разметка сломана, 3 не тот каталог
|
||||
```
|
||||
|
||||
Правка дома касается стольких файлов, сколько у него копий, и последний из них
|
||||
забывают — это и есть причина, по которой копии расходятся. Пересборка делает то
|
||||
же машиной и потому дословна по построению.
|
||||
|
||||
**В гейт коммита скрипт не ставится, и это решение.** Автоматическая пересборка
|
||||
протащила бы правку дома во все копии мимо глаз автора, а правка дома, чья копия
|
||||
уезжает в репозиторий проекта, обязана ещё и попасть в журнал версий канона —
|
||||
этого машина не напишет. Гейт поэтому только **называет** расхождение; согласие с
|
||||
ним остаётся действием человека.
|
||||
|
||||
Разметку разбирает не он сам: `copies.py` импортируется целиком. Второй
|
||||
разборщик той же разметки разошёлся бы с первым молча — ровно тот класс дефекта,
|
||||
против которого механика копий и заведена.
|
||||
|
||||
**Ограда блока кода принадлежит месту, а не дому.** Одно и то же тело живёт в
|
||||
доме внутри ```` ``` ````, а в скелете канона — внутри чужой, объемлющей ограды,
|
||||
и своей там иметь не должно. Пересборка берёт тело дома без крайних оград и
|
||||
надевает обратно ту, что была у копии; пустые строки по краям — так же.
|
||||
|
||||
## Проверка адресов документов
|
||||
|
||||
Адрес документа принадлежит одному плагину, а называют его все: `docs/*` стоит
|
||||
@@ -452,5 +478,8 @@ Glob разводит две половины: коммит, трогающий
|
||||
(`stage_fixed: true`). Иначе исправленный файл остался бы в рабочем дереве, а в
|
||||
историю уехал бы невычищенный — худший из исходов: гейт зелёный, коммит грязный.
|
||||
|
||||
**`resync.py` в гейте нет намеренно** — он чинит, а не проверяет, и его правка
|
||||
обязана быть прочитана глазами (см. выше).
|
||||
|
||||
**Обход разовый — `LEFTHOOK=0 git commit …`.** Он законен ровно для случая,
|
||||
когда найденное нечем чинить прямо сейчас; молча пропущенная проверка — нет.
|
||||
|
||||
Reference in New Issue
Block a user