Make the docs gate block on head and literal divergence while anchors stay a warning, and mark the superseded reason as superseded

This commit is contained in:
heaven 2026-09-17 02:21:45 +03:00
parent 64374b214e
commit 81f9b2ffaf

View file

@ -6,7 +6,12 @@
# │ ДЕЛАЕТ: при коммите, задевающем ЛЮБОЙ док, проверяет file:line-якоря живых доков; при │
# │ коммите с D-логом или PROGRESS дополнительно сверяет три носителя номера головы и │
# │ производные числа доков (счёт очереди, зон, вес открытых строк регистра платформы). │
# │ НЕ ДЕЛАЕТ: не блокирует коммит НИКОГДА — только печатает предупреждение и выходит 0. │
# │ БЛОКИРУЕТ (с 17.09, D39.260 п.3 — слово владельца «блокировать, исправлять, но не хакать»): │
# │ расхождение ГОЛОВЫ и производных ЧИСЕЛ. Это свои носители, они читаются по содержимому │
# │ коммита, и ложного срабатывания у них нет по построению — лечится только правкой. │
# │ ПРЕДУПРЕЖДАЕТ (не блокирует): якоря и неотслеживаемые файлы. Цели якорей читаются из ДЕРЕВА, │
# │ поэтому чужой незакоммиченный код роняет их ТРАНЗИЕНТНО; блокирующий гейт, который врёт │
# │ на чужой работе, начинают обходить — а это ровно то, что запрещено тем же словом. │
# │ Не трогает содержимое, не правит файлы, не лезет в сеть, не запускает тесты. │
# │ ЕСЛИ МЕШАЕТ: `git commit --no-verify` обходит всю цепочку; выключить только этот фрагмент — │
# │ `chmod -x docs/scripts/githooks/pre-commit`. Ни то, ни другое ничего не ломает. │
@ -18,8 +23,9 @@
# │ ПОЧЕМУ ВООБЩЕ: голова CURRENT-STATE отставала ТРИЖДЫ у трёх РАЗНЫХ оркестраторов │
# │ (D39.81 · D39.83 · D39.112 п.5б). Одна ошибка у независимых сессий на одном поле — │
# │ свойство поля, а не сессий, поэтому проверка механическая, а не нормой прозой. │
# │ ПОЧЕМУ ПРЕДУПРЕЖДАЕТ, А НЕ БЛОКИРУЕТ: фрагмент общий, он сработает у сессии, которой я не │
# │ писал промт. Останавливать чужой коммит — решение владельца, не моё (оркестратор №15). │
# │ ⛔ ПРЕЖНИЙ ДОВОД ОТМЕНЁН 17.09. Он гласил: «фрагмент общий, останавливать чужой коммит — │
# │ решение владельца, не моё (оркестратор №15)». Владелец это решение принял: блокировать. │
# │ Оставлено здесь, чтобы отменённое не прочли как действующее. │
# └────────────────────────────────────────────────────────────────────────────────────────────┘
#
# Ложные тревоги, которых здесь СОЗНАТЕЛЬНО избегают, — это важнее, чем полнота: хук, который
@ -63,11 +69,11 @@ if printf '%s\n' "$staged" | grep -qx "$dlog"; then
if [ -n "$note" ] && [ -n "$claimed" ] && [ "$note" != "$claimed" ]; then
echo "pre-commit ⚠ docs: голова разошлась — последняя нота D-лога $note, CURRENT-STATE говорит $claimed." >&2
echo " Норма: голова бампается в ТОМ ЖЕ коммите, что аппенд ноты (промт оркестратора)." >&2
warn=1
block=1
fi
if [ -n "$note" ] && [ -n "$banner" ] && [ "$note" != "$banner" ]; then
echo "pre-commit ⚠ docs: шапка-диапазон D-лога $banner при последней ноте $note." >&2
warn=1
block=1
fi
fi
@ -81,7 +87,7 @@ if printf '%s\n' "$staged" | grep -qE "^($dlog|$prog|$backlog)$"; then
# Печатаем строки-находки, а если их нет (скрипт УПАЛ) — весь вывод: предупреждение с пустым
# телом нечитаемо и учит игнорировать хук.
printf '%s\n' "$out" | grep '✗' >&2 || printf '%s\n' "$out" | tail -5 >&2
warn=1
block=1
fi
fi
fi
@ -124,6 +130,12 @@ if [ -n "$untracked" ]; then
fi
fi
if [ "${block:-0}" -eq 1 ]; then
echo "pre-commit ⛔ КОММИТ ОСТАНОВЛЕН: расхождение головы или производных чисел (D39.260 п.3)." >&2
echo " Это свои носители и ложных тревог у них нет: лечится правкой, а не обходом." >&2
echo " Обход --no-verify существует, но он ДЕЙСТВИЕ, а не мнение: считаешь гейт неправым — напиши владельцу." >&2
exit 1
fi
if [ "$warn" -eq 1 ]; then
echo "pre-commit: это ПРЕДУПРЕЖДЕНИЕ — коммит не остановлен (обход: --no-verify)." >&2
echo " Считаешь, что хук неправ или мешает? Напиши ВЛАДЕЛЬЦУ — не обходи молча и не подпирай хаком." >&2