test(skills): реестр и гард общих inline-реализаций

Навыки автономны, общие утилиты копируются в каждый .ps1/.py, но нигде не было
зафиксировано, какая копия эталонная и какие расхождения законны. Ревизия по #60
показала два класса семей: одни держатся побайтово (support-guard — 16 копий,
db-обвязка — 12), другие разъехались без эталона (resolve_type_str — 6 копий и
6 вариантов, get_ml_text — 7 и 7).

check-inline-drift.mjs держит реестр семей внутри себя: вариант → эталон → копии.
Копия обязана совпадать с эталоном своего варианта; отклоняющийся вариант обязан
иметь обоснование, иначе печатается как долг. Часть расхождений законна (esc_xml
без " в form-* ради раундтрипа), поэтому модель хранит варианты, а не одно
эталонное тело. Разъехавшиеся целиком семьи стоят на храповике maxVariants.

Извлечение тел: PS1 — до строки ровно `}` (балансировка скобок даёт ложные
18 вариантов из 18 копий Assert-EditAllowed); PY — с обязательным снятием
docstring-ов (иначе одинаковый код с разным описанием читается как расхождение).

check-all.mjs — единая точка входа: check-enum-drift и check-uuid-invariant были
рабочими, но не упоминались в README и никем не запускались.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-08-08 17:22:33 +03:00
co-authored by Claude Opus 5
parent fc2d460b57
commit c8144a01e5
4 changed files with 530 additions and 11 deletions
+25
View File
@@ -31,6 +31,31 @@ node tests/skills/verify-snapshots.mjs --help # полный
Перепрогоняет навык из DSL кейса и грузит результат в 1С — отлавливает случаи, когда снапшоты обновили, но платформа уже не принимает выход.
## Гарды-инварианты
Проверяют не вывод навыков, а инварианты исходников — то, что снапшотами не ловится. Навыки
автономны, общие словари и утилиты намеренно продублированы, поэтому нужна защита от расхождения
копий. В `runner.mjs` не входят, запускаются одной командой:
```bash
node tests/skills/check-all.mjs # все гарды сразу
node tests/skills/check-inline-drift.mjs # только один
node tests/skills/check-inline-drift.mjs --list # реестр: семья → эталон → потребители
```
| Гард | Что держит |
|---|---|
| `check-enum-drift.mjs` | allowlist-ы значений перечислений: meta-compile (авторитет) ↔ meta-validate ↔ meta-edit |
| `check-uuid-invariant.mjs` | uuid объекта и сущностей не перегенерируются при правке |
| `check-inline-drift.mjs` | копии общих inline-утилит совпадают с эталонами своих вариантов |
`check-inline-drift.mjs` держит реестр семей внутри себя: у каждой семьи перечислены варианты, у
варианта — навык-эталон и список копий. Отклоняющийся вариант обязан иметь обоснование (`why`),
иначе попадает в список долга. Семьи, разъехавшиеся целиком, стоят на храповике `maxVariants`:
число вариантов не должно расти. Кандидатов в реестр ищет `node debug/inline-utils/scan-dupes.mjs`.
Правишь общую утилиту — правишь эталон, копируешь во всех потребителей варианта, прогоняешь гард.
## Интеграционные тесты
Помимо snapshot-кейсов есть многошаговые сценарии в `integration/<имя>.test.mjs` — цепочка навыков (init → compile → build → validate…), проверяющая что навыки работают вместе. Запуск: