Commit Graph
5 Commits
Author SHA1 Message Date
av eae734f5cc гейт: добавлена проверка ссылок и номеров журнала решений
- `decisions.py` судит четыре вещи: уникальность номеров Т/Р/С, раскладку тем,
  указатель и ссылки — цель существует, подпись называет именно её;
- проверка идёт без glob, как адреса: файл темы и ссылки на него лежат порознь,
  и переименование темы трогает только одну сторону, а ломает обе;
- ссылка внутри блока кода ссылкой не считается — в скелетах канона она
  адресована дереву проекта.
2026-08-13 12:41:13 +03:00
avandClaude Opus 5 12882911a9 словарь, манифесты, README: одно слово — одна вещь, одно описание — один дом
- «готовность» значила и «запись можно брать», и «что считается сделанным»;
  второй смысл стал «определением сделанного» — своё же правило про занятое
  слово запрещало это прямо
- «пайплайн» жил в 24 местах вне журналов при том, что DECISIONS фиксирует
  его уход «целиком»; рабочее имя — конвейер
- «чекпоинт» в review значил стадию и проход, в resolve — остановку человеку;
  слово оставлено за остановкой
- у описания плагина было два дома, и три из четырёх уже разошлись. Сведены,
  и класс закрыт машиной: frontmatter.py сверяет plugin.json с marketplace,
  гейт разбужен на *.json
- README врал про односторонние зависимости и терял healthcheck на диаграмме
- перечень агентов в REMAINING отстал на два поколения

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-09 18:45:39 +03:00
av 872732989a адреса чужих документов сверяются с перечнем владельца
Адрес принадлежит одному плагину, а называют его все: docs/* стоит в
сорока местах конвейера, tasks/ROADMAP.md — в четырёх местах канона.
Переименование в каноне до них не доходит, и заметить это нечем:
протухший адрес попадает в механизм честной деградации ревью и выходит
правдоподобной строкой «документа в проекте нет», а не поломкой.

Перечень берётся из константы владельца — той, по которой он и так
проверяет раскладку. Судится упразднённое, а не незнакомое: список тем
канона открытый, и «нет такого имени» опровергнуть нечем; зато карта
переездов RETIRED и есть перечень запрещённого. Рядом одна догадка —
почти совпавшее имя как опечатка, порог замерен (законные до 0.64,
опечатки от 0.91).

Первый прогон: одна настоящая находка — REMAINING иллюстрировал
смысловой дубль адресом docs/specs/, упразднённым в версии 1 канона.

В гейте без glob: перечень лежит в .py, упоминания в .md, и коммит с
переименованием трогает только первую сторону.
2026-08-09 15:12:46 +03:00
avandClaude Opus 5 61cd9fcd37 гейт судит staged-файлы; рендер диаграмм пошёл параллельно
Гейт проверял рабочее дерево целиком — то есть не то, что уедет в историю, а
то, что лежит на диске рядом. Плюс платил за это временем: пятнадцать секунд на
каждый коммит с правкой markdown, потому что одиннадцать блоков рендерились по
очереди, каждый своим запуском mermaid-cli со своим chromium.

diagrams.py научился двум вещам. Первая — принимать файлы списком: без
аргументов обходит репозиторий как раньше, с аргументами смотрит только
названные, отбирая из них markdown внутри корня (гейт передаёт весь staged, где
есть и скрипты, и удалённое). Вторая — рендерить пулом потоков: работа целиком в
ожидании подпроцесса, своего интерпретатора ей не надо, а потолок в восемь
воркеров упирается в память chromium, а не в двадцать четыре ядра. Порядок
находок берётся из порядка сбора, не из порядка ответов, так что вывод
детерминирован. Весь репозиторий — 3 секунды вместо 15, один файл — 1.

В хуке теперь {staged_files} у диаграмм, ruff и pyrefly. Два исключения
остались, и оба по существу: copies.py сверяет копию с домом, а дом лежит в
другом файле, которого в индексе может не быть — список staged дал бы «копии
дословны» ровно там, где правка дома их и разошлась; frontmatter.py обходит всё
за сотые доли секунды, экономить нечего. Оба объяснены прямо у своих задач.

ruff встал с --fix и stage_fixed: безопасное чинится само и доносится до этого
же коммита. Иначе исправленный файл оставался бы в рабочем дереве, а в историю
уезжал бы невычищенный — гейт зелёный, коммит грязный.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 09:30:56 +03:00
avandClaude Opus 5 5067bc2048 гейт коммита: пять машинных проверок встали в pre-commit
Проверки существовали и запускались руками — то есть тогда, когда о них
вспоминали. Каждая из них ловит ровно тот класс поломок, который не виден при
чтении: фронтматтер разбирает загрузчик скиллов, а не человек; копия правила
расходится с домом молча; диаграмма mermaid выглядит правдоподобно и падает на
рендере; ruff и pyrefly стерегут ноль внешних зависимостей, без которого
tasks.py и docs.py перестают работать в чужом проекте. Полагаться на память в
таком наборе — значит узнавать о поломке от того, кто скачал плагин.

Ставится lefthook (конфиг в lefthook.yml, `lefthook install` один раз на клон),
пять задач в parallel. Glob разводит две половины: правка одних скриптов не
платит за рендер диаграмм (~15 секунд), правка документов не гоняет линтеры.
Внутри своей половины проверяется весь репозиторий, а не изменённые файлы — и
расхождение копии, и находка ruff в соседнем файле это ровно тот случай, когда
правка сломала не себя.

Два свойства названы в README и в шапке конфига, чтобы не выяснялись отладкой.
Первое: судится рабочее дерево, а не индекс — скрипты написаны как обход
репозитория и про git add не знают, поэтому частичный коммит при грязном дереве
проверяется по тому, что на диске. Второе: обход разовый — LEFTHOOK=0, и он
законен ровно для случая, когда найденное нечем чинить прямо сейчас.

Заодно поправлена строка README про диаграммы: «поэтому он не в гейте, а в
руках того, кто правит диаграмму» — с этой правкой она перестала быть верной.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-07 09:24:37 +03:00