This commit is contained in:
@@ -0,0 +1,130 @@
|
||||
# Апрель 2019 — тройное ревью чернового пакета П14 «Валидация форм»
|
||||
|
||||
Статус: **принят в публикационный слой 31 июля 2026 года**. Registry
|
||||
накладывает три ревизии по стабильным slug, не меняя дату и автора исходных
|
||||
публикаций:
|
||||
|
||||
- <code>editorial-2019-04-practice-forms-validation</code>;
|
||||
- <code>editorial-2019-04-mechanism-forms-validation</code>;
|
||||
- <code>editorial-2019-04-field-forms-validation</code>.
|
||||
|
||||
Созданы только:
|
||||
|
||||
- <code>web/scripts/upgrade-2019-04.mjs</code>;
|
||||
- <code>web/public/assets/editorial/2019/forms-validation-contract-2019.svg</code>;
|
||||
- <code>web/public/assets/editorial/2019/forms-validation-state-machine-2019.svg</code>;
|
||||
- <code>web/public/assets/editorial/2019/forms-validation-late-response-2019.svg</code>;
|
||||
- этот файл.
|
||||
|
||||
Все три ревизии намеренно не содержат <code>date</code> или <code>author</code>:
|
||||
эти поля остаются у исходных записей архива. Модуль экспортирует ровно три
|
||||
ревизии. При прямом вызове с <code>--print-revisions</code> он пишет только JSON;
|
||||
<code>--run-fixture</code> отдельно запускает учебную модель обратного порядка
|
||||
ответов.
|
||||
|
||||
## Проход 1. Факты и техника — пройдено
|
||||
|
||||
| Утверждение или решение | Первичный источник | Проверенная граница |
|
||||
| --- | --- | --- |
|
||||
| Нативные ограничения формы и <code>validity</code> — ранняя проверка интерфейса | [HTML Standard: Constraint Validation API](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#the-constraint-validation-api) | Тексты не называют <code>checkValidity()</code> проверкой занятости, прав или защитой API; сервер остаётся источником бизнес-условия |
|
||||
| Нативная отправка формы — отдельный алгоритм браузера | [HTML Standard: form submission](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#form-submission-algorithm) | Локальные правила не выдаются за замену серверной проверки и защиты от прямого запроса |
|
||||
| <code>aria-describedby</code> ссылается на описывающие элементы по ID | [WAI-ARIA 1.1: aria-describedby](https://www.w3.org/TR/wai-aria-1.1/#aria-describedby) | В примерах label остаётся нативным, а подсказка и ошибка имеют устойчивые ID; ARIA не используется вместо input/label |
|
||||
| <code>aria-errormessage</code> применяется вместе с <code>aria-invalid</code>, а релевантное сообщение не прячется | [WAI-ARIA 1.1: aria-errormessage](https://www.w3.org/TR/wai-aria-1.1/#aria-errormessage) | Примеры выставляют invalid только в ошибке и показывают видимый текст; они не обещают одинаковое озвучивание во всех браузерах и скринридерах |
|
||||
| <code>AbortController</code> создаёт signal и может сигнализировать abort | [DOM Standard: AbortController](https://dom.spec.whatwg.org/#abortcontroller) | Отмена названа оптимизацией транспорта. Корректность UI обеспечивается сравнением версии, даже если abort не дошёл до транспорта |
|
||||
| Fetch работает с моделью запроса/ответа и signal при поддержке клиента | [Fetch Standard](https://fetch.spec.whatwg.org/) | В статье нет обещания, что любой адаптер или legacy-клиент отменяется одинаково; запросы проверяются по актуальности после ответа |
|
||||
|
||||
- Главная техническая гипотеза проверена автономным fixture, а не словами:
|
||||
запрос <code>ivan</code> с <code>requestId: 1</code> отвечает позже запроса
|
||||
<code>ivanka</code> с <code>requestId: 2</code>. Результат прогона:
|
||||
|
||||
```json
|
||||
{
|
||||
"results": [
|
||||
{ "requestId": 1, "applied": false, "ignored": "stale-response" },
|
||||
{ "requestId": 2, "applied": true, "phase": "valid" }
|
||||
],
|
||||
"finalState": {
|
||||
"value": "ivanka",
|
||||
"requestId": 2,
|
||||
"phase": "valid",
|
||||
"fieldError": ""
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- Fixture проверяет только порядок и правило <code>requestId</code>. Он не
|
||||
подаётся как результат Network, браузерной трассы, screen reader или
|
||||
production API. Для настоящего экрана статьи оставляют честный маршрут:
|
||||
проверить клавиатуру и Accessibility tree после интеграции.
|
||||
- Контракт <code>fields.email</code>/<code>fields.login</code> явно назван
|
||||
локальным договором приложения, а не обязательным полем HTML или WAI-ARIA.
|
||||
Неизвестный ключ уходит в безопасный общий путь и требует согласования.
|
||||
- Асинхронная проверка не объявлена окончательным резервированием логина:
|
||||
сервер повторяет условие при сохранении, потому что между pre-check и POST
|
||||
другой запрос может занять значение.
|
||||
|
||||
## Проход 2. Редактура и голос М2 / 2019 — пройдено
|
||||
|
||||
| Ревизия | Симптом и цена в начале | Главный технический вопрос | Артефакт и ограничение |
|
||||
| --- | --- | --- | --- |
|
||||
| Практика | Браузер сделал почту зелёной, API отказал; текст может потеряться в общем баннере | Как разделить HTML-ограничение, API-контракт и рендер поля | Карта ответственности, ответ <code>fields</code>, доступная разметка и маршрут внедрения; не обещается единый валидатор для всех форм |
|
||||
| Механизм | <code>isValid</code> и <code>error</code> не объясняют промежуточную фазу и старый ответ | Какие фазы и переходы принадлежат одному полю | Таблица автомата, version guard, fixture и ожидаемые a11y-инварианты; не заявляется универсальная поддержка всех transport-слоёв |
|
||||
| Полевой разбор | Медленный ответ «ivan занят» стирает корректное состояние <code>ivanka</code> | Где сохранять право ответа менять UI и куда ставить ошибку | Временная диаграмма, контрпример и requestId; Accessibility tree описано как план проверки, не как проведённый прогон |
|
||||
|
||||
- Автор остаётся на правдоподобном уровне 2019 года: JavaScript-модули,
|
||||
форма, API-контракт, Fetch и базовая доступность. Нет поздних SLO,
|
||||
распределённой трассировки, feature flags, продуктовых метрик или позиции
|
||||
техлида крупной платформы.
|
||||
- Каждая статья держит цепочку «симптом → причина → проверка → действие →
|
||||
ожидаемый результат → ограничение». Вместо общих фраз названы объект,
|
||||
версия, ключ поля, видимый error-контейнер и условие сравнения.
|
||||
- Автоматический draft gate зафиксировал объём основного тела **11 707**,
|
||||
**12 082** и **10 685** знаков. Все значения находятся в требуемом
|
||||
диапазоне 5 000–15 000 без включения title, meta и раздела источников.
|
||||
- Во всех трёх статьях есть не менее пяти <code>h2</code>, доступная таблица
|
||||
с <code>caption</code>/<code>thead</code>/<code>scope</code>, собственная
|
||||
схема с содержательными <code>alt</code> и <code>figcaption</code>,
|
||||
воспроизводимый код, упорядоченный маршрут и не менее двух первичных
|
||||
источников.
|
||||
|
||||
## Проход 3. Визуал и выпуск — пройдено в пределах автономного пакета
|
||||
|
||||
- <code>forms-validation-contract-2019.svg</code> отделяет HTML-ограничение,
|
||||
клиентское состояние и проверку API. Нижняя обратная стрелка явно называет
|
||||
правило: старый <code>requestId</code> не меняет новое поле.
|
||||
- <code>forms-validation-state-machine-2019.svg</code> показывает допустимые
|
||||
фазы одного input и две пунктирные ветви нового input, которые очищают старую
|
||||
remote-error. Отдельный зачёркнутый путь показывает устаревший ответ.
|
||||
- <code>forms-validation-late-response-2019.svg</code> фиксирует временной
|
||||
порядок t0–t3: быстрый <code>requestId 2</code> применяется, а поздний
|
||||
<code>requestId 1</code> отклоняется. Схема не подменяет fixture, а делает
|
||||
условие render читаемым.
|
||||
- В каждом SVG есть <code>title</code>, <code>desc</code>,
|
||||
<code>role="img"</code>, единый вертикальный <code>viewBox</code>, нет
|
||||
JavaScript, внешних URL или растровых вложений. Подписи сокращены до
|
||||
действия, развёрнутое объяснение вынесено в <code>figcaption</code> статьи.
|
||||
- Этот проход не утверждает, что SVG открывали в конкретном браузере или что
|
||||
снимали фактический Accessibility tree. Он проверяет XML, структурную
|
||||
мобильную пригодность viewBox и связь каждой схемы с объяснением. Браузерный
|
||||
рендер и проверка на реальном экране остаются выпускными действиями после
|
||||
интеграции, а не придуманным доказательством черновика.
|
||||
|
||||
### Выполненные проверки
|
||||
|
||||
```text
|
||||
node --check web/scripts/upgrade-2019-04.mjs
|
||||
cd web && npm run audit:draft -- scripts/upgrade-2019-04.mjs
|
||||
node web/scripts/upgrade-2019-04.mjs --run-fixture
|
||||
xmllint --noout web/public/assets/editorial/2019/forms-validation-contract-2019.svg \
|
||||
web/public/assets/editorial/2019/forms-validation-state-machine-2019.svg \
|
||||
web/public/assets/editorial/2019/forms-validation-late-response-2019.svg
|
||||
```
|
||||
|
||||
Результат: все автономные команды завершились с кодом 0; draft gate прошёл
|
||||
для трёх стабильных slug. После подключения registry основной редактор
|
||||
повторил strict audit: 11 707 / 12 082 / 10 685 знаков, figure, таблицы,
|
||||
код, маршруты и источники прошли. <code>npm run build</code> завершился с
|
||||
кодом 0 и сгенерировал 374 статические страницы.
|
||||
|
||||
Выпусковой вердикт: **принят к публикации**. <code>articles.json</code> не
|
||||
менялся; registry заменяет только редакционные поля по стабильному slug.
|
||||
Reference in New Issue
Block a user