raise editorial quality gate and revise 2018 spring
Build and deploy / deploy (push) Successful in 15s

This commit is contained in:
2026-07-31 09:20:37 +03:00
parent 44c99a2640
commit 90692f0f16
33 changed files with 4563 additions and 52 deletions
+20 -1
View File
@@ -18,17 +18,36 @@
- Добавить минимум один рисунок или диаграмму, один пример и один проверяемый источник.
- Закончить конкретным порядком действий, ограничениями и тем, что именно следует проверить в своём проекте.
## Объём и плотность
- Основной текст статьи, без HTML-разметки, заголовка, метаданных и списка источников, занимает от **5 000 до 15 000 знаков**.
- Нижняя граница — не повод искусственно растягивать выводы. Если тема проста, глубину создают контекст, контрпример, проверка и решение, а не повтор одной мысли.
- Верхняя граница — повод разбить слишком широкую тему на серию. Одна статья отвечает на один главный вопрос.
- Каждый абзац либо добавляет факт, решение, ограничение или следующий шаг. Вступления «вообще о важности темы» и эмоциональные связки без технического смысла вырезаются.
## Техническая речь
- Пишем коротко и предметно: **симптом → причина → проверка → действие**. Предпочитаем глаголы и наблюдаемые факты: «запрос вернул 403», «фильтр исключает запись», «метрика выросла на 18%».
- Один абзац — одна мысль; одно предложение не пытается одновременно описать проблему, историю команды и решение.
- Термин используется только там, где он точнее обычного слова. После первого появления даём расшифровку или пример.
- Не используем общие оценки: «в современном мире», «очень важно», «магическая сила», «просто нужно учитывать». Вместо них называем условие, риск или ограничение.
- Заголовок обещает ровно тот вопрос, на который отвечает текст. Результат не объявляется «универсальным», если он зависит от версии, нагрузки, прав или архитектуры проекта.
## Голос автора
- Для 2017–2018 годов — практичная, тёплая заметка инженера: «давайте разберём», осторожные выводы, внимание к реальной ошибке и следующему шагу.
- Для 2019–2021 годов — инженер развивает T-shape: от PHP и Bitrix к фронтенду, инфраструктуре и данным. Текст всё ещё говорит от первого лица, но уже связывает решение с границами системы.
- Для 2022–2024 годов — системный практик: появляются измерения, надёжность, безопасность, доставка и взаимодействие ролей. Утверждения становятся проверяемее, а выводы — спокойнее.
- Для 2025–2027 годов — наставник и техлид: автор сравнивает варианты, называет стоимость решения, объясняет компромиссы и оставляет команде воспроизводимый способ работы.
- Не подменять опыт общими фразами вроде «важно учитывать» или «магическая сила». Каждое обобщение должно опираться на случай, код, таблицу или источник.
- Не делать вид, что исторический автор уже знает инструменты и практики 2027 года. Поздние материалы могут становиться системнее, но развитие должно быть постепенным.
- Термины и сокращения раскрываются при первом появлении, если они не очевидны из контекста кода.
- Полная временная карта, словарь, переходы навыков и анти-анахронизмы находятся в `editorial/voice/author-trajectory-2017-2027.md`; она обязательна для редакторского прохода.
## Тройное ревью перед публикацией
1. **Факты и техника.** Сверить утверждения с источниками, проверить пример, версионные оговорки, ссылки и отсутствие ложных обещаний.
2. **Редактура и голос.** Проверить постановку проблемы, полноту раскрытия, естественность тона соответствующего года, повторы и ясность переходов.
2. **Редактура и голос.** Проверить постановку проблемы, объём 5–15 тыс. знаков, плотность, прагматичность речи, естественность тона соответствующего года, повторы и ясность переходов.
3. **Визуал и выпуск.** Открыть изображения и диаграммы, проверить таблицы на узком экране, доступность `alt`/подписей, JSON, автоматический аудит и production-сборку.
Результат каждой ручной проверки фиксируется рядом с партией в `editorial/reviews/`.
+2
View File
@@ -34,3 +34,5 @@
## Публикация
Первичный массовый генератор `web/scripts/publishEditorialArchive.mjs` выведен из использования: он не соответствует редакционному стандарту и не должен перезаписывать доработанные статьи. Переработка идёт небольшими тематическими тройками поверх существующего архива. Для каждой тройки есть источник текста, автоматическая проверка, ручное трёхкратное ревью и проверка сборки.
Текущая очередь, состояние архива и входной quality gate описаны в [производственном контуре](production/README.md).
+24
View File
@@ -0,0 +1,24 @@
# Производство редакционных партий
На 31 июля 2026 года строгий аудит проходит 3 из 358 созданных материалов. Остальные 355 не считаются «почти готовыми»: их нужно заменить, а не косметически удлинить.
## Одна партия
Партия содержит три связанные, но не повторяющие друг друга статьи:
1. практический разбор с воспроизводимым решением;
2. объяснение механизма и границ ответственности;
3. полевой кейс, диагностику или сравнение вариантов.
Для каждой статьи автор готовит исследование, основной текст на 5 000–15 000 знаков, отдельный visual asset, таблицу, пример и список источников. Черновой скрипт не имеет права писать в `web/data/articles.json`: он только печатает ревизии через `--print-revisions`.
## Вход в публикацию
Основной редактор интегрирует партию только после того, как одновременно выполнены:
- исследовательское ревью: ссылки проверены, версии и ограничения названы;
- редакторское ревью: проблема в начале, нет шаблонного языка, голос соответствует году;
- визуальное ревью: рисунки открываются, таблицы работают на 375px, у рисунков есть `alt` и подписи;
- `node --check`, XML-проверка диаграмм, `npm run audit:articles -- <slugs>` и production-сборка проходят.
После этого рядом с партией появляется запись в `editorial/reviews/`, а изменение публикуется отдельным коммитом. Ни один скрипт не должен перегенерировать уже отревьюированный архив целиком.
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -22,7 +22,7 @@
- Проблема названа в первом абзаце, а финал даёт проверяемый следующий шаг.
- На партию не найдено повторяющихся длинных предложений; исключены шаблонные формулы из первичного массового архива.
- Тон оставлен практичным для 2018 года: есть «давайте разберём», но нет искусственной ретроспективы с инструментами и уверенностью автора 2027 года.
- Глубина после финальной правки: 5 102, 5 634 и 5 085 символов обычного текста; 9, 9 и 10 минут чтения соответственно.
- Глубина после финальной правки: 5 233, 5 734 и 5 151 знак основного текста без списка источников; 9, 9 и 10 минут чтения соответственно.
## 3. Визуал и выпуск — пройдено
+65
View File
@@ -0,0 +1,65 @@
# Черновое тройное ревью — февраль 2018
Партия не интегрирована в `web/data/articles.json`. Ревизии доступны только через:
```bash
node web/scripts/upgrade-2018-02.mjs --print-revisions
```
## 1. Факты и техника
| Слаг | Главный вопрос | Проверенные первичные источники | Результат |
| --- | --- | --- | --- |
| `editorial-2018-02-practice-php-diagnostics` | Как оставить диагностический факт при 500 и фатальной ошибке PHP? | [set_error_handler](https://www.php.net/manual/en/function.set-error-handler.php), [set_exception_handler](https://www.php.net/manual/en/function.set-exception-handler.php), [register_shutdown_function](https://www.php.net/manual/en/function.register-shutdown-function.php), [error_get_last](https://www.php.net/manual/en/function.error-get-last.php) | Пример не обещает перехватить ошибки до регистрации обработчиков; отдельно названы ограничения фатального пути. |
| `editorial-2018-02-mechanism-php-diagnostics` | Почему строка от `curl_exec()` не означает успех API-операции? | [curl_exec](https://www.php.net/manual/en/function.curl-exec.php), [curl_getinfo](https://www.php.net/manual/en/function.curl-getinfo.php), [curl_errno](https://www.php.net/manual/en/function.curl-errno.php), [RFC 7231](https://www.rfc-editor.org/rfc/rfc7231#section-6) | Строго разделены ошибка cURL, HTTP-статус и контракт тела; повтор записи не рекомендован без идемпотентности. |
| `editorial-2018-02-field-php-diagnostics` | Как отделить битый JSON от корректного `null`? | [json_decode](https://www.php.net/manual/en/function.json-decode.php), [json_last_error](https://www.php.net/manual/en/function.json-last-error.php), [RFC 8259](https://www.rfc-editor.org/rfc/rfc8259.html) | Используется подход PHP 7.1; отмечено, что `JSON_THROW_ON_ERROR` появился только в PHP 7.3. |
Проверено вручную:
- В каждой статье не меньше двух официальных или первичных источников.
- Утверждение о статусах HTTP ограничено протокольным уровнем; успех бизнес-операции проверяется проектным контрактом.
- В журналы не предлагается писать пароли, токены, исходное тело запроса или полный ответ партнёра.
- У примеров есть версия и границы: PHP 7.1, проектные таймауты, отсутствие универсального retry.
## 2. Редактура и голос
| Слаг | Проблема в начале | Техническая речь и тон 2018 | Объём основного текста |
| --- | --- | --- | --- |
| `editorial-2018-02-practice-php-diagnostics` | Ответ 500 без причины в журнале | Короткая практическая заметка: контекст, этап, обработчик, проверка | Проверяется скриптом, диапазон 5 000–15 000 знаков |
| `editorial-2018-02-mechanism-php-diagnostics` | Строка от cURL ошибочно объявляется успешной интеграцией | Симптом → уровень сбоя → запись в журнал → действие | Проверяется скриптом, диапазон 5 000–15 000 знаков |
| `editorial-2018-02-field-php-diagnostics` | `if (!$data)` склеивает несколько разных состояний | Один вопрос о JSON, затем конкретные значения и контракт | Проверяется скриптом, диапазон 5 000–15 000 знаков |
Проверено вручную:
- У каждой статьи один главный вопрос; темы не копируют друг друга: runtime PHP, transport/HTTP и payload JSON.
- Изъяты общие вводные о «важности» и обещания универсального решения.
- Использованы проектные оговорки вместо выдуманных цифр, версий партнёрских API или результатов замеров.
- Статьи заканчиваются действиями и ограничениями до списка источников.
## 3. Визуал и выпуск
| Материал | Назначение | Проверка |
| --- | --- | --- |
| `php-fatal-context-flow.svg` | Показывает три ветки диагностики PHP и общий контекст операции | SVG содержит `title`, `desc`, осмысленный `alt` и подпись в статье |
| `curl-outcome-classifier.svg` | Разделяет транспорт, HTTP и контракт тела | SVG содержит `title`, `desc`, осмысленный `alt` и подпись в статье |
| `json-payload-diagnostic.svg` | Разделяет ошибку декодера и нарушение JSON-контракта | SVG содержит `title`, `desc`, осмысленный `alt` и подпись в статье |
Проверки к запуску перед интеграцией:
```bash
node --check web/scripts/upgrade-2018-02.mjs
node web/scripts/upgrade-2018-02.mjs --print-revisions | jq 'length'
xmllint --noout web/public/assets/editorial/2018/php-fatal-context-flow.svg
xmllint --noout web/public/assets/editorial/2018/curl-outcome-classifier.svg
xmllint --noout web/public/assets/editorial/2018/json-payload-diagnostic.svg
```
После интеграции основной агент должен запустить общий audit-скрипт и production-сборку. Этот авторский черновик их намеренно не запускает: он не меняет архив.
### Результаты авторского прохода
- `node --check web/scripts/upgrade-2018-02.mjs` — PASS.
- `node web/scripts/upgrade-2018-02.mjs --print-revisions` вернул массив из трёх ревизий; встроенная проверка структуры прошла.
- Длина основного текста без источников: 7 109, 6 519 и 6 706 знаков соответственно; все значения в диапазоне 5 000–15 000.
- `xmllint --noout` для трёх SVG — PASS.
- Локальная браузерная отрисовка SVG заблокирована политикой среды, поэтому финальный просмотр на desktop и узком экране остаётся выпускной проверкой после интеграции в страницу. Структурная проверка выполнена: у каждого SVG единый `viewBox 1200×620`, описание `title`/`desc` и все координаты элементов лежат внутри полотна.
+65
View File
@@ -0,0 +1,65 @@
# Март 2018 — безопасная загрузка файлов: draft-review
Статус: принято в публикационный слой 31 июля 2026 после независимого audit. Эта партия существует как три ревизии из `web/scripts/upgrade-2018-03.mjs --print-revisions`; слой `web/data/editorial-revisions.mjs` сопоставляет их только по стабильным slug, не меняя даты, автора или историю Git.
| Slug | Главный вопрос | Основной текст без источников |
| --- | --- | ---: |
| `editorial-2018-03-practice-safe-uploads` | Как принять JPEG или PNG для аватара без доверия к имени и MIME-типу формы? | 5 666 знаков |
| `editorial-2018-03-mechanism-safe-uploads` | Какие признаки файла можно использовать для какой проверки? | 6 209 знаков |
| `editorial-2018-03-field-safe-uploads` | Как выдать владельцу приватный PDF, если файл хранится вне веб-корня? | 5 688 знаков |
## 1. Факты и техника — пройдено
### Практика: приём аватара
- Проверены [коды ошибок загрузки PHP](https://www.php.net/manual/en/features.file-upload.errors.php), [move_uploaded_file](https://www.php.net/manual/en/function.move-uploaded-file.php), [finfo_file](https://www.php.net/manual/en/function.finfo-file.php), [ограничение getimagesize как валидатора](https://www.php.net/manual/en/function.getimagesize.php) и [OWASP File Upload Cheat Sheet](https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html).
- Пример проверяет `UPLOAD_ERR_OK`, прикладной лимит, MIME-тип через Fileinfo и размеры изображения до переноса. `getimagesize()` используется только для размеров, не как доказательство корректности изображения.
- Ограничения названы прямо: нет антивирусной проверки, CSRF-защиты и обработки миниатюр.
### Механизм: границы доверия
- Проверены [RFC 7578 для multipart/form-data](https://www.rfc-editor.org/rfc/rfc7578), [коды ошибок PHP](https://www.php.net/manual/en/features.file-upload.errors.php), [Fileinfo](https://www.php.net/manual/en/function.finfo-file.php), [getimagesize](https://www.php.net/manual/en/function.getimagesize.php) и [OWASP](https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html).
- Воспроизводимый `curl`-пример не утверждает конкретный результат базы magic: он показывает разницу между заявленным клиентом `type` и типом, который определяет Fileinfo.
- Статья не называет Fileinfo антивирусом и не переносит ответственность за лимит всего запроса на одну PHP-функцию.
### Поле: выдача приватного PDF
- Проверены [OWASP для размещения файлов вне webroot](https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html), [header()](https://www.php.net/manual/en/function.header.php), [readfile()](https://www.php.net/manual/en/function.readfile.php) и [RFC 6266 для Content-Disposition](https://www.rfc-editor.org/rfc/rfc6266).
- В коде ID документа и текущий пользователь участвуют в одном SQL-запросе; путь строится только из ключа, прошедшего контрактное регулярное выражение.
- Ограничения не скрыты: в примере нет Range, кеширования, ограничения частоты и эффективной выдачи больших файлов.
Версионная оговорка: код ориентирован на PHP 7.2. В статьях не используются приёмы, добавленные позднее; актуальные страницы PHP Manual взяты как первичный справочник функций и их ограничений.
## 2. Редактура и голос — пройдено после исправления стоп-условия
- Каждая статья отвечает на один вопрос и начинает с наблюдаемой ситуации, а не с общего рассуждения о безопасности.
- Для `mechanism` и `field` первоначальный строгий audit обнаружил недостаточно явную постановку проблемы. В первые два предложения добавлены формулировки `Симптом:` и `Цена ошибки`; сильная исходная подводка сохранена дальше в том же абзаце.
- Повторный CLI-audit подтвердил: обе статьи содержат симптом и цену ошибки в первых 420 знаках; длины — 6 209 и 5 688 знаков соответственно.
- Речь соответствует 2018 году: короткие технические абзацы, «давайте» и «я бы» только там, где автор делает практический вывод; нет обещаний универсального решения, поздних инструментов и шаблонных оборотов.
- Во всех трёх ревизиях есть проблема, таблица, воспроизводимый пример, порядок действий, ограничения, один рисунок и минимум четыре первичных или нормативных источника.
## 3. Визуал и выпуск — пройдено для черновика
- `xmllint --noout` прошёл для трёх SVG: `php-upload-avatar-contract.svg`, `php-upload-trust-signals.svg`, `php-private-download-flow.svg`.
- В локальном рендере SVG проверены title, доступное описание, границы текста и масштаб 1280×720: 31, 26 и 20 текстовых узлов соответственно; выходов за границы нет.
- На первой схеме во время визуальной проверки найден и исправлен контраст номеров этапов: цвет изменён с белого на тёмный `rgb(46, 82, 103)`.
- Каждый рисунок будет иметь осмысленный `alt` и подпись через данные ревизии. Таблицы обёрнуты в `table-scroll`; текущие стили блога добавляют горизонтальную прокрутку при минимальной ширине таблицы 620px.
- Production-сборка и проверка опубликованных URL не запускались намеренно: статьи ещё не интегрированы в `web/data/articles.json`. Это выпускной шаг основного агента, а не основание менять архив из этой ветки.
## Повторённые команды
```sh
node --check web/scripts/upgrade-2018-03.mjs
node web/scripts/upgrade-2018-03.mjs --print-revisions
xmllint --noout \
web/public/assets/editorial/2018/php-upload-avatar-contract.svg \
web/public/assets/editorial/2018/php-upload-trust-signals.svg \
web/public/assets/editorial/2018/php-private-download-flow.svg
```
Результат: три ревизии готовы для точечной интеграции без перезаписи остальных статей.
## Приёмка основного агента
- Повторно пройден строгий `audit-quality-batch.mjs`: 5 666 / 6 209 / 5 688 знаков основного текста; в каждой статье найдены рисунок с `alt`, таблица, код, порядок действий и отдельный раздел источников.
- Проверены безопасный import модуля и CLI-вывод ровно трёх ревизий. Production build после интеграции прошёл и сгенерировал 374 статические страницы.
+34
View File
@@ -0,0 +1,34 @@
# Апрель 2018 — черновики о символьных кодах и ЧПУ
Статус: готово к интеграции основным агентом. Этот черновик не изменяет web/data/articles.json.
| Слаг | Главный вопрос | Основной текст |
| --- | --- | ---: |
| editorial-2018-04-practice-bitrix-slugs | Как получить читаемый CODE и не принять совпадение за успех? | 6 049 знаков |
| editorial-2018-04-mechanism-bitrix-slugs | Что должно совпасть, чтобы адрес стал ELEMENT_CODE? | 6 354 знака |
| editorial-2018-04-field-bitrix-slugs | Как доказать конфликт CODE или широкий фильтр до изменения данных? | 7 111 знаков |
## Ревью 1. Факты и техника — пройдено
- Практическая статья опирается на [CUtil::translit](https://dev.1c-bitrix.ru/api_help/main/reference/cutil/translit.php), [CIBlockElement::GetList](https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php?print=Y) и [CIBlockElement::Add](https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/add.php?print=Y). Сверены параметры транслитерации, фильтры выборки, поле CODE, возврат ID и LAST_ERROR.
- Статья о механизме ЧПУ опирается на [CComponentEngine::ParseComponentPath](https://dev.1c-bitrix.ru/api_help/main/reference/ccomponentengine/parsecomponentpath.php), [CComponentEngine::MakePathFromTemplate](https://dev.1c-bitrix.ru/api_help/main/reference/ccomponentengine/makepathfromtemplate.php) и [CIBlockElement::GetList](https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php?print=Y). В тексте не приписывается Bitrix автоматическая уникальность URL: маршрут, переменные и выборка показаны как отдельные уровни.
- Диагностическая статья опирается на [CIBlockElement::GetList](https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getlist.php?print=Y), [CComponentEngine::ParseComponentPath](https://dev.1c-bitrix.ru/api_help/main/reference/ccomponentengine/parsecomponentpath.php) и [CIBlockElement::Update](https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/update.php?print=Y). Сортировка в примере названа средством повторяемого вывода, а не способом выбрать правильный товар.
- Версионная граница названа явно: использованы старые API, документация которых указывает доступность методов до 2018 года. Конкретные шаблоны компонента, инфоблок и параллельный импорт оставлены проектными условиями.
- Проверены отрицательные сценарии: пустой код, два совпадения, отсутствие совпадений, нераспознанный URL и ошибка обновления.
## Ревью 2. Редактура и голос 2018 года — пройдено
- В первом абзаце каждой статьи поставлены наблюдаемый симптом и один вопрос. Три текста не повторяют друг друга: первый о построении кода, второй о превращении пути в переменную, третий о диагностике неверной карточки.
- Основной текст укладывается в требуемые 5 000–15 000 знаков. Объём набран контрактом данных, воспроизводимыми PHP-примерами, таблицами, контрпримерами и ограничениями, а не повтором вывода.
- Речь намеренно короткая и прикладная: «проверяем», «сверяем», «сохраняем», «не меняем до доказательства». Нет лозунгов, обещаний универсального решения и поздних для автора 2018 года практик.
- Тон оставлен близким ранним заметкам автора: спокойное «давайте разберём», конкретный код Bitrix и оговорка там, где правило зависит от каталога.
- После вычитки удалены общие фразы о важности темы. Термины CODE, ЧПУ, ELEMENT_CODE и GetList раскрываются в контексте первого использования.
## Ревью 3. Визуал и выпуск — пройдено для черновика
- Добавлены и XML-проверены три самостоятельные SVG-схемы: bitrix-slug-build-2018.svg, bitrix-slug-route-2018.svg и bitrix-slug-conflict-2018.svg.
- Все SVG прошли xmllint --noout. Схемы отрендерены в PNG и просмотрены вручную в масштабе 1600 px. Во время просмотра исправлены обрезанная подпись фильтра в первой схеме и пересечение нижней ветки с подписью в третьей.
- В каждом черновике есть figure с alt и подписью, таблица внутри table-scroll, не менее одного блока кода и нумерованная последовательность действий.
- node --check web/scripts/upgrade-2018-04.mjs завершился без ошибок. node web/scripts/upgrade-2018-04.mjs --check подтвердил объём, три источника, таблицу, фигуру и код для каждой ревизии.
- node web/scripts/upgrade-2018-04.mjs --print-revisions выдаёт валидный JSON-массив ровно из трёх ревизий. В каждом тексте ровно один обязательный заголовок Проверяемые источники.
- Окончательную проверку мобильной вёрстки и production-сборку выполняет основной агент после интеграции в архив.
+62
View File
@@ -0,0 +1,62 @@
# Черновое ревью — май 2018: legacy jQuery
Статус: принято в публикационный слой 31 июля 2026 после независимого audit. Партия намеренно не перезаписывает `web/data/articles.json`: `web/data/editorial-revisions.mjs` накладывает ревизии только по стабильным slug.
## Область партии
| Slug | Главный вопрос | Основной текст, знаков |
| --- | --- | ---: |
| editorial-2018-05-practice-legacy-jquery | Как повторно вызвать mount и оставить один обработчик? | 7 718 |
| editorial-2018-05-mechanism-legacy-jquery | Почему прямой click пропадает после .html()? | 8 088 |
| editorial-2018-05-field-legacy-jquery | Как держать один активный Ajax-запрос формы? | 8 729 |
Размеры посчитаны без списка источников и HTML-разметки. Каждый текст отвечает на один вопрос, начинает с наблюдаемого сбоя и заканчивается последовательностью действий с ограничениями.
## Исследование
Все ссылки — первичная официальная документация jQuery; материалы сверены 31 июля 2026 года.
| Статья | Источники |
| --- | --- |
| Повторный mount | [.on()](https://api.jquery.com/on/), [.off()](https://api.jquery.com/off/) |
| Замена DOM | [.html()](https://api.jquery.com/html/), [.on()](https://api.jquery.com/on/), [.off()](https://api.jquery.com/off/), [.data()](https://api.jquery.com/data/) |
| Ajax-форма | [jQuery.ajax()](https://api.jquery.com/jQuery.ajax/), [.serialize()](https://api.jquery.com/serialize/), [.prop()](https://api.jquery.com/prop/), [.data()](https://api.jquery.com/data/), [.removeData()](https://api.jquery.com/removeData/), [deferred.always()](https://api.jquery.com/deferred.always/) |
## Ревью 1 — факты и техника
**Пройдено.**
- Для mount проверены: пространства имён событий, снятие обработчиков по namespace, различие прямой и делегированной привязки, а также версия .on()/.off() — jQuery 1.7+.
- Для .html() проверено основное утверждение: jQuery удаляет данные и события дочерних узлов до замены содержимого. Ограничения делегирования для SVG и не всплывающих событий названы явно. Риск вставки непроверенной HTML-строки не выдан за проблему конкретного API — это предупреждение документации.
- Для Ajax-формы проверены: состав .serialize(), динамическое свойство disabled через .prop(), хранение и удаление маркера через .data()/.removeData(), роли done, fail и always у jqXHR. always используется только для освобождения UI и не анализирует разнородные аргументы resolve/reject.
- Серверные последствия не выдуманы: клиентский замок ограничен текущим DOM-экземпляром; при timeout текст не обещает, что операция не была выполнена.
## Ревью 2 — редактура и голос
**Пройдено.**
- Речь короткая и техническая: симптом → причина → проверка → действие. Нет обещаний «универсального» решения и абстрактных вступлений о важности темы.
- Голос соответствует 2018 году: код на jQuery, IIFE, var, $.ajax; без искусственного переноса поздних фреймворков или роли техлида в раннюю заметку.
- У каждой статьи свой сценарий, таблица, воспроизводимый код и порядок внедрения. Три текста не повторяют один и тот же вывод под разными заголовками.
- Убрано неподтверждённое обобщение о распространённости конкретной версии jQuery в 2018 году; примеры лишь задают поддерживаемую версию.
## Ревью 3 — визуал и выпуск
**Пройдено для черновой партии; после интеграции нужен штатный общий выпускной прогон.**
- Три SVG валидированы командой xmllint --noout и открыты в локальном рендере. После финальной правки нет обрезанных заголовков, стрелок или кодовых строк.
- У каждого будущего contentHtml есть один figure с осмысленными alt и подписью, одна таблица в обёртке div.table-scroll и три блока кода.
- В существующих стилях .table-scroll имеет горизонтальную прокрутку, а таблица — min-width: 620px; это сохраняет читаемость на узком экране без сжатия ячеек.
- Команда node --check web/scripts/upgrade-2018-05.mjs прошла. Команда node web/scripts/upgrade-2018-05.mjs --print-revisions печатает валидный JSON ровно трёх ревизий и не записывает архив.
## Перед интеграцией
1. Основной агент импортирует JSON из параметра --print-revisions и сопоставляет только три перечисленных slug.
2. Запускаются общий аудит партии и production-сборка.
3. На собранных страницах повторяется проверка таблиц в узком viewport, потому что эта ветка по задаче не изменяет articles.json.
## Приёмка основного агента
- Повторный quality-gate прошли все три статьи: 7 718 / 8 088 / 8 729 знаков основного текста, по одной схеме, таблице и трём блокам кода.
- Независимо проверены первые абзацы, источник jQuery API для делегирования и namespace событий, а также граница клиентского замка Ajax-формы. Валидное `typeof value === 'undefined'` внутри примера кода не считается артефактом генерации.
- Модуль экспортирует ровно три revision без побочного вывода при import; production build после интеграции прошёл.
+58
View File
@@ -0,0 +1,58 @@
# [Период] — ручное редакционное ревью
Партия:
- `[slug 1]`
- `[slug 2]`
- `[slug 3]`
Дата проверки: YYYY-MM-DD. Редактор: [имя или роль].
## 1. Факты и техника
Для каждой статьи:
| Статья | Главный тезис | Первичные источники | Версия / ограничение | Пример проверен |
| --- | --- | --- | --- | --- |
| `[slug]` | | | | да / нет |
- [ ] Нет непроверенных цифр, фальшивого опыта и универсальных обещаний.
- [ ] Код, команда, SQL или конфигурация соответствуют описанному сценарию.
- [ ] Известные ограничения стоят рядом с решением, а не спрятаны в финале.
Вердикт: пройти / вернуть в доработку. Причины:
## 2. Редактура, голос и объём
Для каждой статьи:
| Статья | Знаки основного текста | Симптом в начале | Период голоса | Новое умение автора | Шаблонные фразы удалены |
| --- | ---: | --- | --- | --- | --- |
| `[slug]` | | да / нет | | | да / нет |
- [ ] Основной текст — от 5 000 до 15 000 знаков без источников.
- [ ] Речь следует схеме «симптом → причина → проверка → действие».
- [ ] Каждый абзац добавляет технический факт, решение, ограничение или следующий шаг.
- [ ] Нет анахронизмов относительно `editorial/voice/author-trajectory-2017-2027.md`.
Вердикт: пройти / вернуть в доработку. Причины:
## 3. Визуал и выпуск
Для каждой статьи:
| Статья | Visual asset и назначение | `alt` и подпись | Таблица | Мобильная проверка | Сборка |
| --- | --- | --- | --- | --- | --- |
| `[slug]` | | да / нет | да / нет | 375px: да / нет | да / нет |
- [ ] Схема, иллюстрация или график объясняет часть материала, а не заполняет место.
- [ ] Таблица остаётся читаемой или прокручивается внутри контейнера на узком экране.
- [ ] Запущены `node --check`, XML-проверка SVG (если есть), `npm run audit:articles -- <slugs>` и `npm run build`.
Вердикт: пройти / вернуть в доработку. Причины:
## Итог
Статус: готово к интеграции / вернуть автору.
Изменения после ревью:
@@ -0,0 +1,279 @@
# Траектория голоса автора: 2017–2027
Это редакторская карта для продолжения архива. Она описывает не идеального
«технического автора вообще», а наблюдаемую эволюцию DarkRiDDeR: от
практика, который делится найденным решением, к инженеру, способному объяснить
границы системы и выбор команды.
Основание карты — 13 исходных публикаций 2017–2019 годов: рецепты по
Bitrix/PHP и Windows, заметки о D, а также материалы о Webpack и jQuery.
Интервью, переводы и пересказы конференционных докладов важны для тематического
круга автора, но не являются чистым образцом его фразировки. Голос автора в них
лучше искать в заголовке, подводке, выборе примера, пояснениях и практическом
выводе.
## 1. Исходный язык 2017 года
Автор начинает с предмета, а не с рассуждения о его важности. Заголовок обычно
называет стек и операцию: «Bitrix API. Функция для генерации кода элемента…»,
«Ошибка PHP. SSL certificate error…», «Компиляция 64-x разрядных программ…».
Первый абзац быстро даёт знакомую ситуацию: «Часто в Bitrix необходимо…»,
«Недавно столкнулся с такой проблемой…», «При выполнении… может возникнуть
ошибка».
Базовая интонация — доброжелательный коллега рядом с рабочим столом. Он не
строит безличную лекцию, а ведёт читателя по найденному пути: «Для начала
нужно…», «Давайте…», «Создадим…», «Открываем командную строку, пишем…».
После инструкции автор обычно называет ожидаемый результат: «После чего ошибка
должна быть решена», «Если всё прошло удачно…», «В итоге у нас получается…».
Финал осторожный и человеческий: «Возможно, в вашем случае…», «Надеюсь, что
помог», «Поздравляю».
| Наблюдаемый паттерн | Зачем он нужен | Редакторская форма |
| --- | --- | --- |
| Стек + конкретная операция в заголовке | Сразу ограничивает задачу | <code>Bitrix API. Проверка символьного кода перед сохранением</code> |
| Симптом до рецепта | Читатель узнаёт свой случай | <code>Форма возвращает ID, но изображение не привязывается к товару.</code> |
| Последовательность «для начала → действие → результат» | Делает текст выполнимым | Один шаг, команда или фрагмент кода, затем ожидаемый эффект |
| Термин и расшифровка в скобках | Автор не предполагает лишнего опыта | <code>entry-файл (точка входа сборки)</code> при первом упоминании |
| Осторожный вывод | Не выдаёт локальную находку за закон | <code>Этот путь подходит, если проблема находится именно в…</code> |
Синтаксис исходного автора не академический. В нём есть длинные объяснения,
скобки с расшифровками, разговорные переходы и иногда шероховатости. Их не надо
копировать: орфографическая ошибка, калька, устаревшее техническое утверждение
или лишняя эмоциональность не являются частью голоса. Сохраняется другое:
близость к реальному действию, прямой порядок шагов и понятный критерий
готовности.
Постоянная формула автора на всём промежутке:
> симптом → граница проблемы → проверка → действие → ожидаемый результат → ограничение
В 2017 году граница чаще всего локальна: конкретный API-вызов, настройка
Windows, браузер, файл конфигурации или форма Bitrix. Позже формула остаётся,
но граница постепенно расширяется до модуля, сервиса, потока данных и решения
команды.
## 2. Развитие по периодам
### 2017–2018: практик интеграций и среды разработки
**T-shape.** Вертикаль — PHP/Bitrix: инфоблоки, свойства, файлы, торговые
предложения, ошибки интеграции. Ширина — D, Windows-инструменты, браузер,
базовый JavaScript и первая фронтенд-сборка. Автор уверенно показывает
выполнимый фрагмент, но ещё не обобщает его до архитектурного правила.
**Допустимый словарь.** <code>инфоблок</code>, <code>торговое предложение</code>,
<code>символьный код</code>, <code>cURL</code>, <code>CA bundle</code>,
<code>timeout</code>, <code>SDK</code>, <code>linker</code>, <code>entry</code>,
<code>bundle</code>, <code>jQuery</code>, «глобальная переменная». Английский
термин поясняется, если он не виден из кода. Слова «контракт», «граница
ответственности» и «жизненный цикл» возможны, когда они привязаны к конкретным
полям или вызовам, а не заменяют объяснение.
**Синтаксис и тон.** Короткий симптом, затем нумерованный маршрут или код.
Допустимы «давайте», «проверим», «в моём случае», но без заигрывания с
читателем. Сначала действие, затем обоснование. Одно предложение не должно
одновременно объяснять API, историю платформы и решение.
**Виды доказательств.** Воспроизводимый фрагмент кода, текст ошибки, снимок
экрана, команда, файл конфигурации, ручная проверка результата, ссылка на
документацию API. Достаточно локального случая, если автор явно называет его
границы.
**Чего автор ещё не знает.** Он не пишет от лица человека, который строил
SLO, проводил разборы крупных инцидентов, внедрял распределённую трассировку,
проектировал организационные процессы или владеет экономикой платформы. Нельзя
ретроспективно добавлять ему зрелую практику threat modeling, Kubernetes,
feature flags и продуктовые метрики без отдельного, правдоподобного мостика.
### 2019–2021: инженер на стыке фронтенда, доставки и данных
**T-shape.** PHP/интеграции остаются вертикалью, но к ним добавляются
модульный JavaScript, Webpack, HTTP, контейнеризация, SQL и первые
воспроизводимые сценарии доставки. Автор уже видит, что ошибка рождается на
границе модулей, конфигураций и окружений.
**Допустимый словарь.** <code>ES-модуль</code>, <code>dependency graph</code>,
<code>source map</code>, «кеш-заголовок», <code>Dockerfile</code>, «образ»,
«миграция», «индекс», <code>EXPLAIN</code>, <code>pipeline</code>,
<code>rollback</code>. Термины <code>CI/CD</code> и «наблюдаемость» допустимы,
но каждый раз должны быть разложены на конкретный запуск, лог, метрику или
проверку.
**Синтаксис и тон.** Появляется спокойное разделение условий: «если плагин
читает <code>window.jQuery</code>…», «если контейнер стартует от
непривилегированного пользователя…». Автор всё ещё может говорить от первого
лица, но реже использует ободряющие финалы и чаще фиксирует предпосылку, версию
и побочный эффект.
**Виды доказательств.** Конфигурация до/после, размер bundle, сетевой запрос,
вывод сборки, SQL-план, контейнерный лог, тестовый запрос, документированный
rollback. Метрика допустима, когда известны источник, окно измерения и
сравниваемый вариант.
**Чего автор ещё не знает.** Нельзя изображать опыт руководителя большой
платформы, владельца многооблачных расходов или человека с многолетней
практикой incident command. Сложные распределённые схемы допустимы как
изучаемый предмет, но не как безапелляционный личный опыт.
### 2022–2024: системный практик
**T-shape.** Центр тяжести смещается от отдельного рецепта к надёжности
изменения: производительность, доступность, безопасность, тестирование,
релизы, данные и согласование ролей. Глубина остаётся технической — автор не
уходит в абстрактное управление.
**Допустимый словарь.** <code>p95</code>, «бюджет ошибок», <code>trace</code>,
<code>span</code>, «корреляционный идентификатор», <code>rate limit</code>,
<code>threat model</code>, <code>CSP</code>, <code>WCAG</code>, «контракт API»,
«идемпотентность», «канареечный релиз», «откат». Эти слова нельзя ставить
списком: рядом нужны единица измерения, граница ответственности или конкретный
сценарий отказа.
**Синтаксис и тон.** Автор пишет короче и точнее. Вместо «система стала
быстрее» — «p95 ответа снизился с 1,8 до 0,7 с на тестовом наборе из N
запросов». Вместо «следует учесть безопасность» — условие атаки, защитный
контроль и способ проверки. Появляются таблицы вариантов и отдельные абзацы
про цену решения.
**Виды доказательств.** Трасса, график, нагрузочный сценарий, результат
автотеста, матрица прав, модель угроз, чек-лист релиза, план отката. Личный
опыт отделяется от данных из внешней документации.
**Чего автор ещё не знает.** Он ещё не обязан писать стратегию компании,
правила закупок или универсальную организационную модель. Не стоит приписывать
ему неизмеренный опыт внедрения AI-практик на масштабе всей организации.
### 2025–2027: наставник и техлид
**T-shape.** Автор связывает глубину разработки с последствиями для команды:
границы сервисов, владение, стоимость сопровождения, надёжная доставка,
наблюдаемость и безопасное использование новых инструментов. Он объясняет не
только «как исправить», но и почему выбран именно этот компромисс.
**Допустимый словарь.** <code>ADR</code>, <code>owner</code>, <code>SLO</code>,
«стоимость владения», <code>blast radius</code>, «схема миграции», «контроль
деградации», «eval-набор», <code>human review</code>, «политика данных».
Термины из AI, платформенной инженерии и безопасности допустимы только при
технической привязке: входные данные, риск, метрика, контроль и владелец.
**Синтаксис и тон.** Тон спокойный, наставнический и лишён позы. Статья
сравнивает два-три варианта, называет цену каждого и оставляет короткий путь
внедрения. Первое лицо используется для наблюдения из практики, а не как
замена доказательству. Закрытие — не вдохновляющий манифест, а решение,
ограничение и следующий проверяемый шаг.
**Виды доказательств.** Матрица выбора, архитектурная схема, измерение до/после,
последствия инцидента без чувствительных деталей, прогон тестов, план
мониторинга и отката, ADR или иной зафиксированный контекст решения. Если
данные нельзя раскрыть, автор честно описывает метод и не придумывает цифры.
**Чего автор всё ещё не знает.** Десять лет публикаций не дают права
утверждать, что его путь универсален. Автор не делает прогнозов за всю отрасль,
не приписывает команде непроверенные результаты и не заменяет технический
анализ модными словами.
## 3. Как звучит прагматичная техническая речь
Плохая фраза обычно скрывает объект, условие или проверку. Хорошая называет их
прямо.
| Период | Плохо | Хорошо |
| --- | --- | --- |
| 2017–2018 | «Нужно грамотно создавать торговые предложения, иначе будут проблемы.» | «<code>CIBlockElement::Add</code> вернул ID, но предложение ещё не связано с товаром. После сохранения проверяем свойство связи и выборку каталога.» |
| 2019–2021 | «Webpack магически подключает jQuery во всём проекте.» | «Старый плагин читает <code>window.jQuery</code>. Сначала кладём импорт в <code>window</code>, затем подключаем плагин; одного <code>ProvidePlugin</code> для этого случая недостаточно.» |
| 2022–2024 | «Наблюдаемость помогла оптимизировать сервис.» | «Трасса показала 1,1 с ожидания в запросе к партнёру. Ограничили timeout и добавили отдельную метрику ошибок этого вызова.» |
| 2025–2027 | «Надо внедрить AI и Kubernetes по современным стандартам.» | «Для автосуммаризации используем только обезличенный вход. До релиза сравниваем ответы на фиксированном eval-наборе, а спорные случаи оставляем на human review.» |
Короткая техническая речь не означает телеграфный стиль. Контекст нужен, если
без него нельзя повторить решение. Лишним считается предложение, которое не
добавляет симптом, причину, проверку, действие, ограничение или результат.
## 4. Непрерывность эволюции
Во все годы сохраняются пять признаков автора:
1. Тема начинается с конкретной инженерной работы, а не с тренда.
2. Термин привязан к коду, конфигурации или наблюдаемому эффекту.
3. Читателю дают выполнимый следующий шаг.
4. Ограничение называют рядом с решением, а не мелким шрифтом в конце.
5. Заключение возвращает к исходному симптому и критерию проверки.
Меняется глубина этого же движения:
| Этап | Что расширяется | Как это проявляется в тексте |
| --- | --- | --- |
| 2017–2018 | Локальная операция | Код, команда, настройка, ручная проверка |
| 2019–2021 | Граница модулей и окружений | Конфигурация, порядок загрузки, сборка, данные |
| 2022–2024 | Поведение системы после изменения | Метрики, тесты, риски, релиз и откат |
| 2025–2027 | Последствия решения для команды | Варианты, стоимость, владелец, способ повторить решение |
Новая компетенция должна появляться как ответ на предыдущую проблему. Например,
после заметок о timeout естественна статья о границах ожидания между браузером,
прокси и сервисом; после сборки фронтенда — материал о размере bundle или
кешировании; после ручной диагностики — наблюдаемость и автоматическая
проверка. Ненормален скачок от рецепта Bitrix сразу к «корпоративной AI-стратегии»
без цепочки практических задач между ними.
## 5. Обязательные критерии редактора
Редактор считает текст эволюцией автора, а не внезапной статьёй автора 2027
года, только если выполнены все условия ниже.
1. **Временная честность.** Словарь и уровень уверенности соответствуют году.
В статье 2017 года нет нераскрытых <code>SLO</code>,
<code>OpenTelemetry</code>, <code>Kubernetes</code>, <code>LLM eval</code>
и других поздних рамок. В статье 2027 года они объяснены через технический
сценарий, а не используются как декорация.
2. **Преемственность темы.** Новая область вырастает из уже освоенной: CMS и
PHP → фронтенд/сборка → доставка и данные → надёжность и архитектурные
решения. Если мост не очевиден, его нужно назвать во вступлении.
3. **Соразмерное доказательство.** Ранний локальный рецепт подтверждается
кодом и ручной проверкой; поздний системный вывод — измерением, тестом,
схемой, сравнением вариантов или документом решения.
4. **Сохранённая оптика практики.** Даже поздний текст начинает с конкретного
сбоя, ограничения или вопроса реализации. Статья, начинающаяся с
«в современном мире» или с общего манифеста, не проходит.
5. **Постепенное усложнение синтаксиса.** Ранний текст ведёт читателя шагами;
поздний может сравнивать варианты, но не прячет действие за абстрактными
существительными.
6. **Ограниченная компетентность.** Автор называет неизвестное, зависимость от
версии, нагрузки, прав, данных или команды. Уверенный тон не заменяет
границы применимости.
7. **Непридуманный опыт.** Число, инцидент, команда и результат либо имеют
источник, либо описаны как учебный пример. Нельзя фабриковать
«сэкономили 40%» или «внедрили во всей компании».
8. **Практический артефакт.** Есть минимальный путь проверки: код, запрос,
конфигурация, таблица симптомов, схема, тест или измерение. Совет без
артефакта не соответствует исходной манере.
9. **Проверяемый финал.** В конце есть ожидаемый эффект и следующий шаг, а не
лозунг, рекламный призыв или универсальное обещание.
Статья не проходит редактуру, если содержит три или более признака
«внезапного 2027 года»: непояснённый современный жаргон, абстрактный
стратегический тон, метрики без метода, универсальные выводы, отсутствие
выполнимого шага или компетенции, не связанные с предыдущими периодами.
## 6. Три прохода редактора голоса
Эта карта дополняет общий стандарт качества и не заменяет техническое,
фактологическое и визуальное ревью.
1. **Временной проход.** Отметить год статьи, разрешённый словарь и одно новое
умение. Проверить, что оно следует из предыдущей траектории.
2. **Голосовой проход.** Найти симптом в начале, конкретный артефакт в середине
и проверяемый финал. Убрать кальки, общие оценки и фразы, в которых
существительные скрывают действие.
3. **Прагматический проход.** Для каждого абзаца ответить: что читатель теперь
может проверить или сделать? Если ответа нет, сократить, перенести или
заменить абзац фактом.
Короткая карточка решения для редактора:
Год и период:
Постоянные признаки голоса:
Новое умение и мост к нему:
Артефакт доказательства:
Оговорка или граница:
Анахронизмы, которые были удалены:
Вердикт: соответствует / вернуть в доработку