test: гард check-typeset-coverage — вывод meta-info замыкается на вход meta-compile

Связь «прочитал вывод → подал на вход» держалась на честном слове и рвалась
молча в обе стороны: meta-info печатал метки, которых нет в словаре
meta-compile (33 из 41), а в карте meta-info не было видов, которые
meta-compile эмитит, — и они печатались по-английски посреди русского вывода.
Снэпшоты этого не видят: кейсы читают и компилируют по отдельности, круг не
замыкая.

Инвариант строгий в одну сторону: каждая метка читалки обязана быть ключом в
typeSynonyms у meta-compile и вести ровно в тот же канон. Обратное неверно
намеренно — компилятор знает формы, которых читалка не печатает. Заодно гард
сверяет objectTypeMap и refTypeMap между портами навыка: переводы — часть
вывода, и расхождение портов дало бы разный текст на один и тот же файл.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-09-20 17:35:19 +03:00
co-authored by Claude Opus 5
parent 74e88e75c2
commit 1d8a6f2f58
3 changed files with 132 additions and 0 deletions
+19
View File
@@ -108,6 +108,7 @@ node tests/skills/check-inline-drift.mjs --list # реестр: семья →
| `check-type-synonyms.mjs` | словари типов: по общему ключу meta-edit понимает то же, что meta-compile (авторитет) |
| `check-inline-drift.mjs` | копии общих inline-утилит совпадают с эталонами своих вариантов |
| `check-type-maps.mjs` | карты типов метаданных согласованы с таблицей `ChildObjects` из `docs/1c-configuration-spec.md` |
| `check-typeset-coverage.mjs` | имена типов: всё, что печатает `meta-info`, принимает `meta-compile` (авторитет); карты не разошлись между портами |
| `check-format-versions.mjs` | проверенный диапазон версий формата: границы одинаковы во всех навыках и сходятся с лестницей из `docs/1c-configuration-spec.md` |
| `check-form-purposes.mjs` | таблица назначений форм в `form-add`: состав видов, свойство «основная форма» и оба порта сходятся с `docs/1c-form-spec.md` |
| `check-positional-binding.mjs` | read-only навыки (`*-info` / `*-validate` / `cfe-diff`): позиционным остаётся только путь ко входу, лишний позиционный аргумент не перезаписывает указанный файл |
@@ -122,6 +123,24 @@ node tests/skills/check-inline-drift.mjs --list # реестр: семья →
Правишь общую утилиту — правишь эталон, копируешь во всех потребителей варианта, прогоняешь гард.
`check-typeset-coverage.mjs` замыкает круг «прочитал вывод → подал на вход». `meta-info`
читающий навык, и модель несёт его строки обратно в `meta-compile`; до гарда эта связь держалась на
честном слове и рвалась молча в обе стороны. `meta-info` печатал `ДокументОбъект.Заказ` в источниках
подписки, а компилятор отвечал «Неизвестный тип»: русских объектных имён в словаре не было — 33
метки из 41. И наоборот, в карте читалки не было `ConstantValueManager` и
`ChartOfCalculationTypesObject`, хотя компилятор их эмитит, — типы печатались по-английски посреди
русского вывода. Снэпшоты этого не видят: кейсы читают и компилируют по отдельности, круг не
замыкая.
Инвариант строгий в одну сторону: каждая метка, которую умеет печатать `meta-info`, обязана быть
ключом в `typeSynonyms` у `meta-compile` и вести ровно в тот же канон. Обратное неверно намеренно —
компилятор знает формы, которых читалка не печатает (английские, полные варианты рядом с
аббревиатурами). Заодно гард сверяет `objectTypeMap`/`refTypeMap` между портами навыка: значения
переводов — часть вывода, и расхождение портов дало бы разный текст на один и тот же файл.
Добавляешь вид в карту `meta-info` — заводи русскую метку в словарь `meta-compile` (и в копию
`meta-edit`, её держит `check-type-synonyms.mjs`).
`check-nonascii-fs.mjs` держит `tests/common/fsutil.mjs` — единственное место, где тесты, хуки и
движок `web-test` удаляют и копируют файлы. На Windows `fs.rmSync` и `fs.cpSync` **молча** ничего
не делают, если не-ASCII символы есть в самом аргументе пути ([nodejs/node#61067][nafs]): фикстура