Files
huncode 238c1f7688
Build and deploy / deploy (push) Successful in 13s
revise February to May 2019 articles
2026-07-31 10:32:34 +03:00

131 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Апрель 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.