rewrite 2026-09 and 2027 articles for reader-facing quality
Build and deploy / deploy (push) Successful in 18s

This commit is contained in:
2026-07-31 22:26:56 +03:00
parent 3bfc3f21c4
commit 440c8721dc
69 changed files with 4424 additions and 3533 deletions
+26 -70
View File
@@ -1,82 +1,38 @@
# P115 — September 2027: «Серия для инженера, который растёт»
# Редакторское ревью: сентябрь 2027
## Статус и граница
Пакет переписан как три самостоятельных технических материала про API-контракты. Исторические slug сохранены, но заголовки, excerpts, body и SVG рассказывают о HTTP-интерфейсах, JSON-валидации и code review API-diff.
Редакторская дата: **2026-07-31**. Период 2027-09 ещё не наступил; пакет является только **plan/scenario** с source cutoff **2026-07-31**. Он не сообщает о реальной учебной программе, репозитории, mentee, упражнении, review, feedback, прогрессе, owner, очереди или production effect.
## Три содержательных прохода
Модуль принимает только named fixed in-memory literals. Он не читает files, network, environment, clock, secrets, telemetry, system или data и не создаёт учебный процесс. Единственный accepted evaluator output — `synthetic-plan-hand-off`; в accepted и stop output всегда `productionEffect: not-attempted`.
### `editorial-2027-09-practice-mentor-series`
## Проход 1 — facts / temporal / voice
1. Факты и пример: до — фиксированный literal о навыке и отсутствии наблюдения; после — `validateCustomerResponse` с обязательными `id`, `revision`, `state`, положительной и отрицательной ветками. Причина: пример должен проверять форму HTTP-ответа, а не редакционный статус.
2. Структура и голос: до — абстрактное рассуждение о развитии; после — проблема несовместимого ответа и стоимость rollback стоят в первых двух абзацах, затем идут таблица breaking changes, причина, действие и ограничение. Причина: читателю нужен инженерный маршрут.
3. Визуал и доступность: до — «карта навыка»; после — схема `Endpoint → Форма → Потребитель` с русскими `<title>` и `<desc>`, содержательными `alt` и caption. Причина: рисунок теперь объясняет границу API, а не внутренний процесс.
| Статья | Body chars без sources | Угол | Временная граница | Источники и boundary |
| --- | ---: | --- | --- | --- |
| `editorial-2027-09-practice-mentor-series` | 9 227 | ситуация → synthetic prompt → критерий наблюдения | 2026-07-31 / 2027-09 / cutoff 2026-07-31 | RFC 2119 (March 1997) и RFC 8174 (May 2017), immutable IETF RFC; только нормативная лексика literal, не доказательство обучения |
| `editorial-2027-09-mechanism-mentor-series` | 9 169 | skill map, review loop, deliberate practice и falsifiability | та же | те же URL/version/date; не создают review, feedback, participant или model of learning |
| `editorial-2027-09-field-mentor-series` | 9 249 | hand-off самостоятельности и evidence без narrative | та же | те же URL/version/date; не назначают owner, процесс или персональную оценку |
### `editorial-2027-09-mechanism-mentor-series`
- Оба URL проверены `curl -I`: RFC 2119 и RFC 8174 вернули HTTP 200. Это первичные immutable RFC до cutoff.
- Первые два абзаца каждой статьи называют конкретную проблему и цену ошибки. У каждой статьи отдельные таблица, SVG, runnable safe example, упорядоченные действия, ограничения и следующий шаг.
- Голос 2025–2027: прагматичный техлидский разбор границ и стоимости. Нет общего мотивационного призыва, заявленного результата или фальшивого опыта. Deliberate practice используется только как ограничитель рассуждения, не как доказанная модель обучения.
- Фактологический verdict: **pass**. Temporal verdict: **pass**. Voice verdict: **pass**.
1. Факты и пример: до — evaluator для skill map; после — `validateFilterInput`, который показывает диапазон `limit`, enum `state` и безопасное значение по умолчанию. Причина: отделить JSON-форму от бизнес-инварианта и состояния.
2. Структура и голос: до — обещание карты уровня; после — три слоя валидации, матрица статусов `400/409/403`, порядок проверки и явное ограничение JSON Schema. Причина: «valid» больше не скрывает различие между документом и операцией.
3. Визуал и доступность: до — practice/review matrix; после — матрица «форма → инвариант → состояние → право» с русскими title/desc и подписью. Причина: визуальный объект должен помогать выбрать класс ошибки.
## Проход 2 — literal safety / fail closed
### `editorial-2027-09-field-mentor-series`
`mentor-series-plan-v1` принят только как `synthetic-plan-hand-off`. Factory делает JSON clone и recursive deep freeze; evaluator сравнивает input с known fixed literal. Неизвестный object не нормализуется.
1. Факты и пример: до — hand-off самостоятельности; после — `classifyApiChange`, который различает удаление поля, новое required-поле и сужение enum. Причина: code review должен иметь наблюдаемое правило классификации diff.
2. Структура и голос: до — мета-описание передачи; после — маршрут от API-diff к consumer tests, compatibility matrix, expand/contract и rollback. Причина: действие и ограничение должны следовать из риска совместимости.
3. Визуал и доступность: до — петля назначения владельца; после — схема `Diff → Класс риска → Потребители → Expand/switch/contract` с веткой остановки. Причина: схема показывает обратимость миграции и читается на узком экране.
| Literal | Ожидаемый результат | Фактический результат |
| --- | --- | --- |
| `mentor-series-plan-v1` | `synthetic-plan-hand-off` | pass |
| `mentor-series-undated-v1` | `stop-temporal-boundary-required` | pass |
| `mentor-series-implicit-skill-v1` | `stop-unnamed-or-implicit-skill` | pass |
| `mentor-series-invented-review-v1` | `stop-invented-observation-review-feedback-or-progress` | pass |
| `mentor-series-invented-feedback-v1` | `stop-invented-observation-review-feedback-or-progress` | pass |
| `mentor-series-invented-outcome-v1` | `stop-invented-observation-review-feedback-or-progress` | pass |
| `mentor-series-invented-owner-v1` | `stop-invented-autonomy-owner-or-process` | pass |
## Источники и границы применения
- Unnamed/implicit skill не допускается; `skillMap` и `exercise` обязаны быть exact named synthetic literals.
- Claimed observation, review, feedback, progress и outcome останавливаются. `autonomy: not-evaluated`, `recipient: not-assigned` и `process: not-created` не получают fallback.
- Fixture: **10/10** — 7/7 literal statuses и 3/3 article checks. `productionEffect: not-attempted` не является наблюдением о production.
- Safety/fail-closed verdict: **pass**.
- [OpenAPI Specification 3.1.1](https://spec.openapis.org/oas/v3.1.1.html), 24 октября 2024 года: структура HTTP-интерфейса; не доказывает runtime-ответ.
- [JSON Schema Core 2020-12](https://json-schema.org/draft/2020-12/json-schema-core.html), draft 2020-12: форма JSON; не проверяет права и состояние базы.
- [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html), июнь 2022 года: HTTP-методы, статусы и представления; не описывает конкретный сервис.
## Проход 3 — visual / mobile / a11y / safety + strict duplicate scan
## Проверки
- Каждый SVG содержит русские `title` и `desc`; каждая статья содержит отдельные русские `alt` и `figcaption`. SVG поясняют контракт карты, матрицу review и петлю hand-off, а не выступают декоративной иллюстрацией.
- `xmllint --noout` прошёл для трёх assets. Safety scan на `script`, `foreignObject`, `javascript:`, `data:image` и event-handler attributes — empty/pass.
- Sharp создал 3 PNG `375x225`; они открыты вручную. На mobile читаемы: карта удерживает три состояния и stop, matrix — все три колонки и пять строк, hand-off — четыре gate и красный stop. Обрезаний или наложений не обнаружено.
- `npm run audit:draft -- scripts/upgrade-2027-09.mjs` — pass по трём exact slug и lengths 9 227 / 9 169 / 9 249.
- Строгий duplicate scan исключал section `Проверяемые источники`, но включал `<p>` и `<pre>`; runnable code участвовал. Прочитаны P102–P114: 39 prior articles, 120 comparisons (117 current-to-prior + 3 внутрипакетные), `hits: []`; совпадений exact paragraphs длиной 160+ и common 12-word fragments нет.
- Visual/mobile/a11y/safety verdict: **pass**. Duplicate scan verdict: **pass**.
## Фактически выполненные команды
```sh
cd web
node --check scripts/upgrade-2027-09.mjs
node scripts/upgrade-2027-09.mjs --verify-fixture
npm run audit:draft -- scripts/upgrade-2027-09.mjs
xmllint --noout public/assets/editorial/2027/mentor-series-2027-skill-map-contract.svg public/assets/editorial/2027/mentor-series-2027-practice-review-matrix.svg public/assets/editorial/2027/mentor-series-2027-autonomy-handoff-loop.svg
rg -n -i '<(script|foreignObject)\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=' public/assets/editorial/2027/mentor-series-2027-skill-map-contract.svg public/assets/editorial/2027/mentor-series-2027-practice-review-matrix.svg public/assets/editorial/2027/mentor-series-2027-autonomy-handoff-loop.svg
node --input-type=module -e 'import sharp from "sharp"; /* three SVG → 375px PNG */'
curl -I https://www.rfc-editor.org/rfc/rfc2119.html
curl -I https://www.rfc-editor.org/rfc/rfc8174.html
```
## Disposition
Изменены только пять разрешённых файлов P115:
- `web/scripts/upgrade-2027-09.mjs`
- `editorial/reviews/2027-09-draft.md`
- `web/public/assets/editorial/2027/mentor-series-2027-skill-map-contract.svg`
- `web/public/assets/editorial/2027/mentor-series-2027-practice-review-matrix.svg`
- `web/public/assets/editorial/2027/mentor-series-2027-autonomy-handoff-loop.svg`
Registry, README, очередь, `articles.json`, app и чужие пакеты не изменялись этой работой. Git не использовался.
## Независимое приёмочное ревью
- Первичные источники повторно открыты 2026-07-31: RFC 2119 подтверждает статус BCP и дату March 1997, RFC 8174 — статус BCP, дату May 2017 и уточнение смысла заглавных ключевых слов. В статьях они применены только к точности требований к literal; они не используются как источник об обучении или оценке человека.
- Повторно выполнены `node --check`, fixture (**10/10**), `npm run audit:draft` и три runnable-примера. Проверены их фактические outputs: они выводят только synthetic literals и `synthetic-plan-hand-off`; внешнего ввода и побочных действий нет.
- Три SVG прошли XML/safety scan и открыты после рендера Sharp в ширине 375 px. Текст, стрелки, stop-ветки и подписи читаемы; декоративных или небезопасных элементов нет.
- Строгий повторный duplicate scan P102–P115: **42 статьи**, **861 сравнение**, sources исключены, code включён, common 12-word fragments — `[]`.
- Приёмочный verdict: **pass**. Пакет включён в registry как 347–349-й материал; production build и публикация выполняются после общей проверки интеграции.
- `node --check scripts/upgrade-2027-09.mjs` — PASS.
- `node scripts/upgrade-2027-09.mjs --verify-fixture` — PASS, 9/9.
- `npm run audit:draft -- scripts/upgrade-2027-09.mjs` — PASS, 6140 / 6119 / 6027 body chars по отчёту audit.
- `npm run audit:articles -- editorial-2027-09-practice-mentor-series editorial-2027-09-mechanism-mentor-series editorial-2027-09-field-mentor-series` — PASS.
- `xmllint --noout` и SVG safety scan — PASS для трёх существующих assets.
- Ручная проверка Sharp 375 px выполнена после общего рендера; обрезаний и наложений нет.