Files
dev-skills/decisions/48-foreign-tool-form-by-query.md
T
av bf6a173115 журнал решений: разложен по теме на файл, метки решений стали номерами
- DECISIONS.md (4040 строк, 65 тем) → decisions/, файл на тему плюс указатель;
- буквенные метки решений заменены сквозными Р1–Р234, следствия получили
  префикс С при прежних номерах: схема букв выродилась до пятибуквенных и
  сломалась — `АЕАКЛ` была занята и темой 53, и темой 65;
- 42 перекрёстные ссылки переписаны под новые номера и стали живыми; где номер
  означал тему, а слово стояло «решение», формулировка исправлена.
2026-08-13 12:40:56 +03:00

4.1 KiB

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. Дешёвая проверка как ворота дорогой. Опрос версии стоит копейки и точно говорит, могла ли измениться дорогая величина. Так дорогая проверка остаётся редкой и при этом не забытой.