исправлены находки ревью проектной стороны

- манифест читается так, как записан: решётка внутри строки не открывает
  комментарий, скобка внутри комментария не закрывает массив, имя внутри
  комментария не становится подпиской; новый ключ встаёт после массива,
  а не внутрь него
- всё записываемое проходит через manifest.Quote — обратный слэш в пути
  делал файл, который инструмент сам не читает
- маркер локальной части переехал в doc и пропускает огороженные блоки:
  процитированный в примере маркер больше не считается границей, а копия
  без маркера не перезаписывается молча
- лишний позиционный аргумент отсекается: flag прекращал разбор и прятал
  флаги после себя, из-за чего pull, list и check игнорировали --for
- заведены тесты проверок копий, включая молчание на исправной копии
This commit is contained in:
av
2026-07-27 21:16:29 +03:00
parent 23d88c4048
commit b6b0976c19
19 changed files with 904 additions and 197 deletions
+26 -3
View File
@@ -68,7 +68,14 @@ internal/cli команды, диалог, два режима
заголовка до следующего заголовка любого уровня. Метка открывает блок только
первой в абзаце и полужирным. Огороженные блоки кода исключаются везде;
инлайн-код вырезается там, где ищутся ссылки, и не вырезается там, где ищутся
пути канона.
пути канона. Маркер локальной части — то же самое: `doc.LocalMarker` один на
весь инструмент, `doc.Marker()` пропускает огороженные блоки, потому что
конвенция о ведении копий этот маркер цитирует.
- **Манифест читается так, как он записан.** Решётка внутри строки не открывает
комментарий, скобка внутри комментария не закрывает массив, имя внутри
комментария не подписка. Регуляркой по сырым строкам это не берётся —
`splitComment` и `scanCode` в `internal/manifest`. Превращение комментария в
данные — единственная ошибка, из которой нет дороги назад.
- **Уровень называется ссылкой, а не путём.** Проект ссылается на набор, набор
на язык; `source.Ref` разбирает ссылку, `source.Open` отдаёт директорию,
которую можно читать. Транспортов два, но `Kind` — перечисление, а не булево:
@@ -114,7 +121,16 @@ internal/cli команды, диалог, два режима
- **Целостность набора проверяется локально.** Когда `[language] source`
заполнен, `suite check` не тянет описание языка и пропускает проверки
документов о языке (META-30 в том числе), проверяя вместо этого саму ссылку.
Проверка гоняется на каждой правке и в сеть ходить не должна.
Проверка гоняется на каждой правке и в сеть ходить не должна. Пропуск
объявляется строкой в выводе: молча не выполненная проверка читается ровно
как пройденная.
- **Всё, что попадает в манифест, проходит через `manifest.Quote`.** Обратный
слэш в пути — обычный случай, на котором инструмент перестаёт читать файл,
который сам записал.
- **Позиционный аргумент отсекается явно.** `flag` прекращает разбор на первом
не-флаге, поэтому лишний аргумент не просто лежит без дела — он прячет все
флаги после себя. `noStrayArgs` в командах без позиционных, ручное снятие
темы с головы в `convy add`.
## Проверки
@@ -128,7 +144,8 @@ internal/cli команды, диалог, два режима
Новая проверка заводится вместе с двумя тестами: что она срабатывает и что она
**молчит** там, где не должна. Второй важнее: проверка, краснеющая на исправном
файле, выключается целиком. Ложные срабатывания собраны в
`TestNoFalsePositives`.
`TestNoFalsePositives` для набора и в `TestCopiesAreSilentOnASoundCopy` для
копий.
Перед тем как заводить проверку, стоит прогнать её замысел по живому канону
(`dev-conventions`): если она покраснеет на исправном наборе, замысел неверен.
@@ -152,6 +169,12 @@ internal/cli команды, диалог, два режима
- `convy add` пишет подписку после сборки — если сборка прошла, а запись в
манифест упала, копия останется неучтённой. Обратный порядок хуже: подписка
без файла отправляет следующий `pull` искать то, чего не делали.
- Директории компонентов сверяются на равенство, а не на вложенность. Компонент
в `docs` и компонент в `docs/sub` манифест пропустит; `convy check` от
двойных находок защищён отдельно (`distinct`).
- `lang.Recognize` при отсутствии словаря с совпавшим номером версии отдаёт
первого кандидата, у которого совпали слова. Пока версия в реестре одна, это
безвредно; со второй версией того же естественного языка станет неверно.
## Тесты