Новый хук: запрет ссылок на номера этапов плана в коде #14
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Заведено по замечанию на ревью jamzap/backend!462: «(Этап 6) — и подобные слова не должны быть у нас в коде».
Зачем отдельный хук
no-mvp-phase-languageзапрещает ровно эту фазовую рамку, но по одному слову —MVP. «Этап 6» — та же рамка, привязанная к номеру в плане разработки, и вред от неё прямее: из «Этап 8» не следует ничего о поведении кода. Через полгода читатель не знает, что это был за этап, а план давно закрыт.Особенно плохо в файлах, которые грузятся в стартовый контекст агента. Реальный пример из jamzap/backend,
app/admin/core/model_admin.py:9: «На Этапе 3 реально используется толькоlist_display+search_fields». Агент читает это как описание текущего состояния и проверить не может.Расширять
no-mvp-phase-languageнельзя: его скоуп у потребителей включаетdocs/**, а в плановом документе перечень этапов — предмет документа. Нужен отдельный id, который потребитель наводит только на код.Что ловить
Слово + номер этапа:
Этап 6,Этапа 3,Этапе 2,Фаза 2.5,Milestone 2,Sprint 4, плюс форма с кавычками —Этап «Preview Tool».Чего НЕ ловить — важнее
Слово «фаза» само по себе легитимно, когда описывает фазы алгоритма, а не этапы плана. Живой пример,
app/modules/content/services/catalog_audit.py:Слово то же, смысл другой, вреда нет. Отсюда требование: признаком должен быть номер (или закавыченное имя этапа), а не слово. Буквенные
Фаза A/Фаза Bобязаны проходить.Замеры на реальном дереве
jamzap/backend: 64 места в 36 файлах, основная масса
app/admin/**(26) иtests/admin/**(9). Формы:(Этап N),Этап N добавляет ...,наследие Этапа 3,live-баг Этапа 2,Регрессия Этапа 5,Definition of Done Этапа 5,(Фаза 2.5).Приёмка
Этап N/Этапа N/Этапе N,Фаза N,Milestone N,Sprint NловятсяФаза A/Фаза B(буква вместо номера) проходят — фикстура обязательнаЭтап «Имя»ловитсяfiles:, дефолтного нет — как уno-broken-repo-pathsФаза Aпокраснеет), выпадение падежных формПотребитель: jamzap/backend#478.
Исключения фраз прописываем не скрипте. Так как для каждой репы они могут быть свои. Так же как и добавлять ключевое слово, что мы должны поймать. Так же "Фаза A" может быть как легитимна, так и нет.
Беру в работу. План с учётом замечания про конфигурируемость — ветка
feature/no-plan-stage-refs.Что настраивает потребитель, а что зашито
Зашита в скрипт только форма нарушения: ключевое слово + номер (
Этап 6,Фаза 2.5,Milestone 2) либо ключевое слово + закавыченное имя (Этап «Preview Tool»). Всё остальное — аргументы вargs:consumer-конфига, потому что и словарь, и легитимность зависят от репозитория:--keyword СЛОВО--keywords a,b,c--pattern REGEXФаза Aне легитимна, ловит и её:--pattern 'Фаза\s+[A-Z]\b'--allow REGEXДефолтный набор ключевых слов:
Этап,Фаза,Milestone,Sprint,Phase,Stage. Падежи ловятся хвостом\w*(Этапа,Этапе,Этапов), регистр не важен. Списка исключений-фраз в скрипте нет вовсе — только--allowу потребителя.Дефолт «нужен номер» остаётся дефолтом, а не законом:
Фаза Aпроходит, пока репозиторий не попросит обратного через--pattern. Это ровно тот случай, о котором сказано в комментарии — легитимность буквенной фазы решается по месту.Скоуп
typesв манифесте не задаётся, дефолтногоfilesнет — как уno-broken-repo-paths. Потребитель наводит хук только на код;docs/**не скоупит, поэтому расширятьno-mvp-phase-languageи не понадобилось.Проверка
Фикстуры
fixtures/plan_stages/: падежные формы,Фаза 2.5,Milestone/Sprint, закавыченное имя, буквеннаяФаза A/Фаза Bизcatalog_audit.py(обязана проходить), фазы алгоритма в docstring'е, работа--keyword/--pattern/--allow. Мутации, каждая обязана уронить smoke: снятие требования номера (краснеетФаза A), выпадение падежного хвоста, потеря--allow.Версию проставлю при мерже — сейчас в очереди два PR (#7 и #13), и номер зависит от порядка.
Закрываю: хук
no-plan-stage-refsвmain, версия0.16.0(#20).Замечание про конфигурируемость учтено буквально: списка фраз в скрипте нет вовсе, есть только форма нарушения. Всё остальное —
args:у потребителя:--keywordдобавляет слово,--keywordsзаменяет набор,--patternдобавляет свою форму (ею же ловитсяФаза Aтам, где она нелегитимна),--allowснимает фразу, законную в этом репозитории. Дефолтный набор —Этап,Фаз,Milestone,Sprint,Phase,Stage.Одна оговорка, которую стоит знать заранее: легитимна по умолчанию именно буквенная нумерация фаз.
Фаза 1иStage 1покраснеют — отличить «первая фаза алгоритма» от «первый этап плана» по тексту нельзя, и это лечится у потребителя через--allow. В README записано.Приёмка закрыта целиком, включая мутации: снятие требования номера и необязательный разделитель красят
Фаза A, выпадение падежного хвоста и снос любого слова из дефолтного набора роняют свой кейс — каждая форма проверяется отдельной фикстурой с пином фрагмента в выводе. Мисконфиг (--pattern '(',--keywords '') даёт вердикт, а не трейсбек и не молчаливый зелёный.Потребитель — jamzap/backend#478 (64 места в 36 файлах), отдельным MR после релиза. Пин
rev: v0.16.0заработает после #16 — тегов на remote пока нет.