closeForm умел только Escape. На реальном стенде Escape не закрывает ни
модальную форму, ни даже обычный список — форма оставалась открытой, и
resetState считал контекст грязным.
- Каскад закрытия (closeCrossScript в dom/forms.mjs): Escape → крестик
плавающего окна (ps<N>, модалка поверх формы) → крестик страницы формы
(VW_page<N>, работает и при скрытой панели вкладок) → крестик активной
вкладки (класс select, не первый попавшийся .openedClose). Порядок и якоря
замерены живьём. Крестик формы бьёт вкладочный, потому что панель открытых
может быть выключена настройкой.
- nothingToClose: когда Escape не помог и крестика нет нигде — платформа сама
говорит, что поверхность не закрывается, то есть это рабочий стол. Этот сигнал
и питает «чисто» в resetState, без базового снимка и списков-исключений.
- Семантика подтверждения по смыслу вопроса (pickConfirmationLabel): 1С теми же
кнопками «Да/Нет» задаёт разные вопросы. «Сохранить изменения?» → save?Да:Нет
(как было); «Закрыть согласование?» → Да=закрыть (иначе save:false жал «Нет» =
«остаться», и модалка утекала в следующий тест). Решение по вопросительному
предложению; неизвестная формулировка → прежнее поведение.
- Ответственность DOM: поиск крестика вынесен в dom/forms.mjs (генератор скрипта
для page.evaluate), close.mjs его только зовёт. Диагностика приведена к
английскому, как остальной модуль; русским остаётся лишь цитата платформы.
Проверено на свежей базе пилота: модалка «Комментарий и согласование» →
closeForm({save:false}) = closed:true, answered:Да, viaCross:true, formCount 2→1
(критерий пилота); стопка документ→список→стол разбирается насквозь и
останавливается на столе. Полный регресс 25/25, closeForm зовёт каждый тест.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Приводим авторский контент (.ps1/.psm1/.py/.mjs/.md/.json, пин .bsl)
к единому LF и закрепляем политикой в .gitattributes. Инструмент правки
всегда пишет LF, поэтому единый LF убирает EOL-шум в диффах, ложные
срабатывания blame и налог на ручную синхронизацию CRLF-файлов.
BOM на .ps1 сохранён (git с eol=lf меняет только CR<->LF, BOM не трогает).
Данные 1С (*.xml) и бинарники под нормализацию не берём.
Гейт: PS-порт 459/459, Python-порт 459/459, web-test E2E 22/22 (с пересборкой стенда).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
getFormState — высокоуровневая операция «прочитать состояние формы»,
семантически в forms/ ближе чем в core/ (foundational плумбинг движка).
engine/core/form-state.mjs → engine/forms/state.mjs
Все 11 importer'ов обновлены. Внутри state.mjs пути исправлены:
'./state.mjs' → '../core/state.mjs', './errors.mjs' → '../core/errors.mjs'.
03-fillfields регресс зелёный.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>