журнал решений: разложен по теме на файл, метки решений стали номерами
- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель; - буквенные метки решений заменены сквозными Р1–Р234, следствия получили префикс С при прежних номерах: схема букв выродилась до пятибуквенных и сломалась — `АЕАКЛ` была занята и темой 53, и темой 65; - 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер означал тему, а слово стояло «решение», формулировка исправлена.
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
# 48. Форма чужого инструмента держится опросом инструмента, а не памятью (2026-08-07)
|
||||
|
||||
**Р189. Схема и артефакты OpenSpec записаны в скрипте как слепок, и у слепка
|
||||
есть сторож.** Проверка формы `config.yaml` знает имя схемы и перечень
|
||||
артефактов (`proposal`, `specs`, `design`, `tasks`). Это не наше решение, а
|
||||
состояние чужого инструмента: OpenSpec переименует артефакт — правила под
|
||||
прежним именем перестанут применяться, конфиг останется выглядеть написанным, а
|
||||
канон продолжит требовать прежнее. Все три стороны при этом молчат.
|
||||
|
||||
Сторожем сделано сравнение версий: `check` спрашивает `openspec --version`
|
||||
(десятые доли секунды) и сравнивает `major.minor` с той, на которой форма
|
||||
сверялась. Разошлось — **замечание**, не отказ, с именем команды, которая
|
||||
перепроверяет. Патч-версия в сравнение не берётся намеренно: формы она не
|
||||
меняет, а нагоняй на каждый багфикс приучает пролистывать весь блок.
|
||||
|
||||
**Р190. Перепроверка спрашивает инструмент, а не нас.** `docs.py openspec-form`
|
||||
берёт `openspec templates --json` — перечень артефактов текущей схемы — и
|
||||
печатает, что разошлось с константами. Дорогой вызов вынесен из `check`
|
||||
сознательно: он стоит втрое дороже опроса версии, а ответ меняется только вместе
|
||||
с версией. Дешёвая проверка служит **воротами** дорогой, и дорогая не ржавеет,
|
||||
потому что зовут её не по памяти.
|
||||
|
||||
**Чинится расхождение в плагине, а не в проекте, и это сказано в трёх местах.**
|
||||
Проект в такой ситуации не виноват и починить ничего не может: у него нет ни
|
||||
констант скрипта, ни скелета, ни журнала версий канона. Замечание поэтому
|
||||
адресовано владельцу плагина, а команда печатает три адреса правки списком.
|
||||
|
||||
**Заодно поймано ложное срабатывание на живом конфиге.** Первый вариант искал
|
||||
ключи `rules` отступом по всему файлу и нашёл их внутри литерального блока
|
||||
`context: |`: строки «Language: Russian» и «av-dev-pm:review-pipeline» выглядят
|
||||
ключами. Проверка теперь идёт от строки `rules:` до следующего ключа нулевой
|
||||
колонки. Правило, краснеющее на правде, хуже отсутствующего — его перестают
|
||||
читать целиком.
|
||||
|
||||
## Что из этого следует
|
||||
|
||||
**С169. Знание о чужом инструменте, записанное у себя, — это слепок с датой.**
|
||||
Он законен, пока рядом стоит тот, кто заметит, что дата протухла; без сторожа он
|
||||
превращается в уверенное враньё.
|
||||
|
||||
**С170. Дешёвая проверка как ворота дорогой.** Опрос версии стоит копейки и
|
||||
точно говорит, могла ли измениться дорогая величина. Так дорогая проверка
|
||||
остаётся редкой и при этом не забытой.
|
||||
Reference in New Issue
Block a user