From 94381bb007b2d231010ec3295f4b2ffd625fc996 Mon Sep 17 00:00:00 2001 From: heaven Date: Mon, 31 Aug 2026 22:38:55 +0300 Subject: [PATCH] Write the owner's ruling that the test ban is about motive, and teach the hook to name untracked files the pathspec commit form would drop --- CLAUDE.md | 2 +- docs/scripts/githooks/pre-commit | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/CLAUDE.md b/CLAUDE.md index 7e11f320..1de4baee 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -69,7 +69,7 @@ Go-бэкенд издательского художественного пер - Дисциплина: не верь заголовкам — грунтуй выводы `file:line`/цитатой; спорное верифицируй адверсариально (author≠reviewer); эмпирика на текстах, знакомых моделям по претрейну (классика, известные переводы), — предварительная: вес имеет только замер на целевом жанре. - **Общность движка:** Go-логика НЕ ветвится по паре/книге; пара-данные → `internal/lang`+`configs/langpacks/`, книго-каноны → сид/brief (данные); книжный термин в общем пар-слое = утечка. Тест-данные пары легитимны. Норматив (только больные места): `docs/architecture/12-go-style-notes.md`. Ревью-вопрос по умолчанию: «заработает ли на паре, которой в репо ещё НЕТ, без правки Go?» - **При компакции/сжатии контекста ВСЕГДА сохранять:** список изменённых файлов · незакрытые находки ревью и их диспозиции · обязательства и открытые вопросы сессии · команды тестов (D39.121). -- **Тесты и гейты не подгонять под зелень:** править или удалять тест/голден/гейт, чтобы он прошёл, — НЕДОПУСТИМО; несогласие с тестом — вопрос оркестратору пингом, не правка (D39.121). +- **Тесты и гейты не подгонять под зелень:** править или удалять тест/голден/гейт, чтобы он прошёл, — НЕДОПУСТИМО; несогласие с тестом — вопрос оркестратору пингом, не правка (D39.121). ⚠ **Запрет — про МОТИВ, и различие несущее (решение владельца 31.08):** правка *чтобы прошло* — запрещена; правка, вызванная ЗАКАЗАННОЙ сменой поведения, — обычное обслуживание, и **держать протухший тест НЕ НУЖНО: техдолг правим, а не консервируем**. Цена смешения уже уплачена — сессия сознательно оставила внутри теста ратифицированно-дефектный механизм, потому что чинить его ей было нельзя. Условие одно: такая правка ОБЪЯВЛЯЕТСЯ в отчёте — что изменилось в поведении, какой тест это описывал и куда уехала гарантия. - **Мандат самопроверки в промтах сессий (обязателен, решение владельца):** промты полигон-сессий — и вообще любых пишущих код / запросы к моделям — ДОЛЖНЫ явно требовать ревью ИСПОЛНЕНИЕМ: своего кода + сформированных запросов к моделям + полученных результатов. Сессии регулярно ошибаются и багуют, и это искажает результат; **самоотчёт «проверено» без исполнения регулярно оказывается ложным и стоит денег**. Бэкенд-промты — явный бэкенд-ревью после кода (обычно отрабатывает по опыту, но требовать явно). Пост-хок адверсариальная верификация оркестратора при лендинге — второй рубеж, НЕ замена самопроверки. ⚠ **Исполнения мало: промт заказывает адверсариальный проход сессии по СВОЕЙ готовой работе; глубину и веер сессия выбирает под предмет, промт даёт направление — что в этом паке уязвимо.** ⚠ **Fable 5** — обычно хватает одного-двух агентов, но это РЕКОМЕНДАЦИЯ, не потолок: веер под предмет выбирает сессия. Модель задавай агенту ЯВНО и знай, сколько их у тебя работает. diff --git a/docs/scripts/githooks/pre-commit b/docs/scripts/githooks/pre-commit index b339ece2..0e34ee26 100755 --- a/docs/scripts/githooks/pre-commit +++ b/docs/scripts/githooks/pre-commit @@ -96,6 +96,31 @@ if command -v python3 >/dev/null 2>&1 && [ -f docs/scripts/counts.py ]; then fi fi +# Untracked-под-коммитом: pathspec-форма коммита МОЛЧА роняет неотслеживаемые файлы. +# `git commit -- <пути>` обходит индекс и берёт рабочее дерево только для ОТСЛЕЖИВАЕМЫХ путей, +# поэтому новый файл, даже застейдженный, в коммит не попадает. Ровно так 31.08 уехал коммит, чей +# `migrations.sha256` уже ссылался на три миграции, оставшиеся снаружи; на свежем клоне схема +# оказалась бы короче на три шага, а симптом — «почему схема не та» у следующего человека. +# ⚠ Шум низок ПО ПОСТРОЕНИЮ: gitignored файлы (books/, .env, песочницы) в `--porcelain` не видны, +# поэтому сюда попадает только по-настоящему новое и неигнорируемое — то есть ровно тот случай, +# ради которого предупреждение и стоит. +untracked=$(git status --porcelain --untracked-files=normal | sed -n 's/^?? //p') +if [ -n "$untracked" ]; then + dirs=$(printf '%s\n' "$staged" | sed 's#/[^/]*$##' | sort -u) + hits='' + for d in $dirs; do + h=$(printf '%s\n' "$untracked" | grep -E "^${d}/[^/]*$" || true) + [ -n "$h" ] && hits="${hits}${h} +" + done + if [ -n "$hits" ]; then + echo "pre-commit ⚠ неотслеживаемые файлы в каталогах ЭТОГО коммита — pathspec-форма их РОНЯЕТ:" >&2 + printf '%s' "$hits" | sed 's/^/ ?? /' >&2 + echo ' Нужны в коммите? git add -- <путь>, затем проверь состав: git show --name-only' >&2 + warn=1 + fi +fi + if [ "$warn" -eq 1 ]; then echo "pre-commit: это ПРЕДУПРЕЖДЕНИЕ — коммит не остановлен (обход: --no-verify)." >&2 echo " Считаешь, что хук неправ или мешает? Напиши ВЛАДЕЛЬЦУ — не обходи молча и не подпирай хаком." >&2