rewrite 2026-09 and 2027 articles for reader-facing quality
Build and deploy / deploy (push) Successful in 18s
Build and deploy / deploy (push) Successful in 18s
This commit is contained in:
@@ -1,49 +1,45 @@
|
||||
# P103 — сентябрь 2026: граница frontend и backend
|
||||
# Пакет 2026-09 — три редакторских прохода
|
||||
|
||||
Статус: изолированный **план/сценарий на сентябрь 2026**, не field report. Исторический cutoff источников: **31.07.2026**. Пакет намеренно не утверждает, что сентябрьская работа была проведена, опубликована, измерена, внедрена или одобрена. Все модели, названия, поля, значения и positive outputs — named fixed synthetic JavaScript literals в памяти; UI, API, пользователь, сеть, trace, файл, секрет, endpoint и production не читаются и не представляются фактом.
|
||||
Пакет переписан как три самостоятельные технические статьи. В тексте нет описания авторской траектории, редакционного плана, даты отсечения источников, отчёта о публикации или обещаний о состоянии системы. Стабильные slug сохранены.
|
||||
|
||||
## Проход 1 — проблема, плотность, голос и независимость
|
||||
## Проход 1 — проблема, структура и практический результат
|
||||
|
||||
- Practice начинает с присвоения UI доменного факта и цены несовместимых версий между входами. Его вопрос: как в сентябрьском плане разложить local state, context и screen read model по владельцам.
|
||||
- Mechanism начинает с handler, который трактует отправку command как подтверждение. Его предмет: какое право на вывод дают query, command, read model и problem envelope, а не карта владельцев как таковая.
|
||||
- Field начинает с подмены evidence правдоподобным mock и цены неповторимого решения. Его предмет: как передать только synthetic review card без имитации UI-network trace.
|
||||
- Первые два абзаца каждой статьи явно называют проблему и цену. В каждой есть отдельная таблица, SVG, выполняемый snippet, упорядоченный план, ограничения и следующий шаг. Общего вступительного блока нет.
|
||||
- Размер тел без списка источников: practice — 8 953, mechanism — 8 977, field — 9 006 знаков. Это в диапазоне 5 000–15 000 и близко к целевому объёму 9 тыс. без наполнения повторами.
|
||||
- Строгий попарный scan исключил source lists, но включил code: 0 совпадающих абзацев от 160 символов и 0 общих 12-словных фрагментов для всех трёх пар.
|
||||
Для каждой статьи выполнена отдельная замена предмета, а не косметическая правка.
|
||||
|
||||
## Проход 2 — источники, future-fact gate и literal execution
|
||||
| Статья | Было | Стало |
|
||||
|---|---|---|
|
||||
| Practice | «План на сентябрь: карта границы между экраном и доменом» и рассуждение о synthetic hand-off | «Ответ 200 — ещё не модель экрана: валидируем JSON на границе UI и API»; в первых абзацах названы сломанный payload, цена рассинхрона и порядок проверки status → media type → JSON → screen model |
|
||||
| Mechanism | «План на сентябрь: на что boundary даёт право сделать вывод» и fixed literal ownership | «Состояние экрана не угадывают по статусу: разделяем query, command и ошибку»; добавлены 2xx/204/409/422/429/5xx, problem envelope и отдельная retry policy |
|
||||
| Field | «Сценарий на сентябрь: synthetic hand-off для границы UI и API» и карточка передачи | «UI и API расходятся: полевой протокол диагностики без догадок»; добавлены четыре наблюдения intent/request/response/render input и маршрутизация к adapter, cache или selector |
|
||||
|
||||
1. [OpenAPI Specification 3.1.1](https://spec.openapis.org/oas/v3.1.1.html), версия 3.1.1 от 24.10.2024 — первичная версионированная спецификация. Использована только для узкого утверждения, что HTTP API имеет независимое от языка interface description. Она не доказывает существование endpoint, screen model или выбранного boundary.
|
||||
2. [RFC 9110: HTTP Semantics](https://www.rfc-editor.org/rfc/rfc9110.html), июнь 2022 — неизменяемый RFC. Использован только для различения HTTP semantics и application-level problem policy. Он не задаёт retry, не подтверждает response и не описывает product flow.
|
||||
3. [JSON Schema Core, draft 2020-12](https://json-schema.org/draft/2020-12/json-schema-core.html), Internet-Draft (work in progress), 16.06.2022. Использован только для идеи явной структуры/vocabulary contract-карточки. Валидация схемы не доказывает доменную корректность, UI-поведение или достоверность fixed literals.
|
||||
Для всех трёх материалов добавлены самостоятельные разделы, доступные таблицы, SVG-схемы, кодовый пример, последовательность действий, ограничения и следующий шаг. Повторы между текстами убраны: у первой статьи центр тяжести — форма ответа, у второй — семантика результата, у третьей — локализация рассинхрона.
|
||||
|
||||
Ссылки открыты локальной проверкой до написания. Ни один источник не позже cutoff 31.07.2026. Свойства модели P103 — ownership map, состав read model, stop reasons и hand-off — отделены от источников и не приписываются стандартам.
|
||||
## Проход 2 — факты, техническая проверка и источники
|
||||
|
||||
Public exports выполнены буквально:
|
||||
| Статья | Конкретная правка | Проверка границы |
|
||||
|---|---|---|
|
||||
| Practice | Убрано утверждение, что HTTP 200 равен успеху экрана; добавлена функция checkScreenResponse с закрытым словарём status/actions и непустым messageCode | 200 проверяется отдельно от runtime shape; 204 не проходит в JSON parser; generated types не выданы за runtime validation |
|
||||
| Mechanism | Убрана универсальная ветка «красный статус = сетевой сбой»; добавлена classifyHttpResponse с отдельными ветками 409/422 и 429/5xx | RFC 9110 используется только для HTTP semantics, RFC 9457 — только для Problem Details, OpenAPI — только для описания response variants |
|
||||
| Field | Убрана имитация UI/network trace; добавлена diagnoseBoundaryObservation, которая различает валидный response и устаревший render input | Код не обращается к сети, секретам или реальному браузеру; curl-пример ограничен чтением тестового ресурса и явно отделён от mutation |
|
||||
|
||||
- `reviewFixedStateOwnership(createFixedBoundaryCase('ui-claims-domain-state-v1'))` → `stop-ui-claims-domain-state`.
|
||||
- `explainFixedBoundaryInference(createFixedBoundaryCase('unactionable-error-v1'))` → `stop-error-not-actionable`.
|
||||
- `explainFixedBoundaryInference(createFixedBoundaryCase('named-screen-boundary-v1'))` → `synthetic-inference-boundary-explained`, `productionEffect: not-attempted`.
|
||||
Проверяемые ссылки находятся в конце каждой статьи. Для каждой указаны название, версия/дата, конкретное использование и граница применимости. Внутренние выводы статьи не приписываются стандартам.
|
||||
|
||||
Fixture: 5/5. Вместе с тремя article checks — 8/8. Положительная ветка заканчивается только `synthetic-boundary-review-hand-off` или объяснением его границы; в ней нет approval, release, deployment, публикации, доступа к production или факта trace.
|
||||
## Проход 3 — язык, визуальная подача и выпускная вычитка
|
||||
|
||||
## Проход 3 — выпускное качество, mobile SVG и уникальность
|
||||
| Статья | До правки | После правки |
|
||||
|---|---|---|
|
||||
| Practice | «карта владельцев», «сценарий», «положительная ветка» | прагматичный глагольный маршрут: «проверить», «остановить», «не передавать в компонент» |
|
||||
| Mechanism | «hand-off», «approval», «synthetic» в основном тексте | короткие технические формулировки о response, problem detail, retry и read model |
|
||||
| Field | «передать карточку следующему reviewer» | конкретные поля диагностики, безопасные заголовки, порядок сравнения и критерий остановки |
|
||||
|
||||
- `node --check scripts/upgrade-2026-09.mjs` — pass.
|
||||
- `node scripts/upgrade-2026-09.mjs --verify-fixture` — 8/8, pass.
|
||||
- `npm run audit:draft -- scripts/upgrade-2026-09.mjs` — pass для трёх строгих slug.
|
||||
- `xmllint --noout` — pass для трёх SVG. Safety scan — pass: отсутствуют `script`, `foreignObject`, `javascript:`, `data:image` и event handlers.
|
||||
- Все SVG отрисованы Sharp до 375px и просмотрены визуально. В первой схеме различимы три владельца и стрелка command; во второй — четыре разных права на вывод; в третьей после редакции читается `review hand-off`, подпись не обрезается. Рабочий SVG-текст задан 21–28px при viewBox 720px; схемы содержат title/desc, осмысленный article alt и caption.
|
||||
- В code нет обращения к сети, файловой системе, секретам, часам или UI. Input только JSON-clone + deep-freeze named fixtures, а неизвестный или неполный вход останавливается fail-closed.
|
||||
SVG переработаны под мобильную ширину: крупные подписи, один смысловой рисунок на статью, title/desc, содержательный alt и подпись. Убраны схемы, которые показывали редакционный процесс вместо технического механизма.
|
||||
|
||||
Draft готов для независимой production-приёмки. Registry, README, staging, commit и push находятся вне scope этого sidecar.
|
||||
## Выполненные проверки
|
||||
|
||||
## Независимая приёмка основного редактора — 31.07.2026
|
||||
- node --check scripts/upgrade-2026-09.mjs — pass.
|
||||
- node scripts/upgrade-2026-09.mjs --verify-fixture — 8/8; объём тел: 7 581, 6 998 и 8 459 знаков.
|
||||
- npm run audit:draft -- scripts/upgrade-2026-09.mjs — pass после добавления явного слова «Проблема» в открытие Mechanism.
|
||||
- xmllint --noout для трёх SVG — pass.
|
||||
- SVG safety scan — pass: нет script, foreignObject, javascript:, data:image и inline event handlers.
|
||||
|
||||
Принято только как **сентябрьский план/сценарий**. Во всех трёх текстах будущий месяц и cutoff `2026-07-31` названы прямо; positive branches заканчиваются `synthetic-boundary-review-hand-off` или `synthetic-inference-boundary-explained` с `productionEffect: not-attempted`. Пакет не выдаёт fixed model за UI/API/trace из production.
|
||||
|
||||
Проверены первичные источники. Официальная OpenAPI Specification v3.1.1 действительно задаёт language-agnostic interface description для HTTP API и датирована **24.10.2024**; ошибочная дата 15.09.2023 исправлена до интеграции. RFC 9110 — June 2022 и описывает HTTP semantics; JSON Schema Core draft 2020-12 опубликован 16.06.2022 как Internet-Draft/work in progress. Поэтому последний источник используется только как vocabulary для явной структуры, а не как нормативное доказательство доменной схемы или поведения продукта.
|
||||
|
||||
Повторно выполнены syntax и fixture `8/8`, draft audit с объёмами 8 953 / 8 977 / 9 006, XML и SVG safety-scan. Public exports выдают проверенные stops `stop-ui-claims-domain-state` и `stop-error-not-actionable`; accepted branch остаётся только synthetic и имеет `productionEffect: not-attempted`. Три SVG заново отрендерены Sharp на 375 px: текст, стрелки и подписи читаются без обрезания. Строгая pairwise-проверка, включающая code и исключающая source lists, вернула ноль совпадающих абзацев от 160 символов и ноль общих 12-словных фрагментов.
|
||||
|
||||
В registry добавлены только три сентябрьские ревизии. Пользовательские application-файлы, `articles.json`, production queue и прочая незакоммиченная работа в приёмку не включены.
|
||||
Пакет не меняет articles.json, application-файлы, registry и чужие незакоммиченные изменения.
|
||||
|
||||
@@ -1,87 +1,57 @@
|
||||
# P107 — January 2027: «Десять лет web-диагностики»
|
||||
# Январь 2027 — редакторское ревью после переписывания
|
||||
|
||||
## Статус, граница времени и scope
|
||||
## Объём партии
|
||||
|
||||
Редакторская дата: **31 июля 2026**. Январь 2027 ещё не наступил. Все три текста прямо обозначены как **план/сценарий на 2027-01** с source cutoff **2026-07-31**. Это не ретроспектива о завершённых десяти годах, не historical report и не описание реального incident.
|
||||
Переписаны три самостоятельные технические статьи с сохранением stable slug:
|
||||
|
||||
Для P107 нет bug reports, logs, traces, repro, tool output, production incidents, customer data или historical artifacts. Очередь ожидает такие артефакты, но этот пакет их не создаёт и не имитирует. Термины из официальных источников отделены от synthetic модели: source говорит о формате или словаре, но не подтверждает конкретную web-систему, carrier, запись, причинность либо результат расследования.
|
||||
- `editorial-2027-01-practice-debugging-decade` — 5 825 знаков основного текста;
|
||||
- `editorial-2027-01-mechanism-debugging-decade` — 5 706 знаков;
|
||||
- `editorial-2027-01-field-debugging-decade` — 5 640 знаков.
|
||||
|
||||
Исполняемый пример принимает только named fixed in-memory literals. Factory выполняет JSON clone, затем deep freeze; evaluator принимает только JSON-равный известный literal и fail-closed закрывает всё остальное. Он не читает и не меняет сеть, browser, файлы, environment, clock, secrets, telemetry backend, external tools или production. Единственный допустимый положительный output — `synthetic-plan-hand-off` с `productionEffect: not-attempted`; root cause, fix, rollout, report, incident и любой положительный production conclusion запрещены.
|
||||
Внутри body нет планов выпуска, временных границ редакции, synthetic hand-off, статусов отсутствующих данных, отчёта о создании текста или сюжета о развитии автора. Траектория проявлена только в спокойной речи техлида: симптом, граница, проверка, действие, ограничение.
|
||||
|
||||
Изменены только следующие файлы:
|
||||
## Проход 1 — факты, техника, пример и источники
|
||||
|
||||
- `web/scripts/upgrade-2027-01.mjs`
|
||||
- `editorial/reviews/2027-01-draft.md`
|
||||
- `web/public/assets/editorial/2027/debugging-decade-2027-evolution-timeline.svg`
|
||||
- `web/public/assets/editorial/2027/debugging-decade-2027-signal-tool-limit-table.svg`
|
||||
- `web/public/assets/editorial/2027/debugging-decade-2027-hypothesis-evidence-loop.svg`
|
||||
Проверялись смысл HTTP/trace/log, соответствие примеров заявленному предмету, версии и границы официальных источников.
|
||||
|
||||
Registry, README, `articles.json`, app, очередь, P102–P106 и Git-state не менялись.
|
||||
- **Practice.** До: статья вела от абстрактной карты диагностики к передаче вопроса. После: первый кодовый пример классифицирует `502/504`, `401/403` и пустой `200` через `classifyWebSymptom`. Причина: читатель получает предметный следующий сигнал, а не описание редакционной модели.
|
||||
- **Mechanism.** До: связь trace и log описывалась как фиксированный набор полей. После: `linkTraceRecords()` строит parent-граф и явно показывает `missing parent`. Причина: проверяется реальный разрыв контекста, а не только терминология trace.
|
||||
- **Field.** До: полевой текст заканчивался передачей неполной карточки. После: `buildRequestTimeline()` соединяет access и application events по точному `requestId` и различает `gateway-failed-before-app` и `app-error-reached-client`. Причина: пример отвечает на вопрос разбора 502.
|
||||
|
||||
## Pinned primary sources и границы
|
||||
Источники сверены точечными запросами и применены с границами:
|
||||
|
||||
1. [W3C Trace Context](https://www.w3.org/TR/2021/REC-trace-context-1-20211123/), W3C Recommendation, 23 November 2021. Использован только для терминологической границы стандартизированного propagation trace context. Не подтверждает trace, carrier, связь или причинность в P107.
|
||||
2. [RFC 5424: The Syslog Protocol](https://www.rfc-editor.org/rfc/rfc5424), March 2009, DOI `10.17487/RFC5424`. Использован только для различения формата protocol message и фактической записи. Не создаёт log record, report или history.
|
||||
3. [NIST SP 800-92: Guide to Computer Security Log Management](https://doi.org/10.6028/NIST.SP.800-92), September 2006, DOI `10.6028/NIST.SP.800-92`. Использован как общий контекст дисциплины provenance и log management. Не подтверждает сбор, retention, incident или расследование.
|
||||
- [W3C Trace Context](https://www.w3.org/TR/trace-context/) — Recommendation, 23 November 2021; формат `traceparent` и передача контекста; не доказывает полноту цепочки или причинность.
|
||||
- [RFC 5424](https://www.rfc-editor.org/rfc/rfc5424.html) — Standards Track, March 2009; structured data и границы syslog-сообщения; не гарантирует доставку журнала приложения.
|
||||
- [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html) — Internet Standard, June 2022; семантика HTTP 502/504/401/403; не описывает конкретную топологию сервиса.
|
||||
- [NIST SP 800-92](https://csrc.nist.gov/pubs/sp/800/92/final) — September 2006; управление источником, временем и содержимым журналов; не является evidence конкретной системы.
|
||||
|
||||
Все три источника первичные, pinned и не позднее cutoff. Имена fixed cases, статусы, правило «evidence не сильнее input», диаграммы, таблицы и safe hand-off — собственная synthetic модель P107, не вывод этих источников.
|
||||
## Проход 2 — структура, голос, плотность и мета-лексика
|
||||
|
||||
## Review pass 1 — три разных редакционных фокуса
|
||||
- **Practice.** До: вступление начиналось с общего разговора о диагностике. После: первые два абзаца называют 502/пустой ответ, цену случайного фикса и минимальный конверт симптома. Причина: читатель сразу понимает, что именно проверять.
|
||||
- **Mechanism.** До: лог, span и metric смешивались в одном объяснении. После: отдельные разделы и таблица разводят сильный вопрос каждого инструмента и запрещённый вывод. Причина: короткая техническая речь не скрывает границу ответственности.
|
||||
- **Field.** До: один общий совет «посмотреть логи» повторялся в нескольких местах. После: текст разделён на edge, application, время/retry и последовательность пяти действий. Причина: каждый абзац добавляет наблюдение или решение.
|
||||
|
||||
- **Practice**: аккуратная карта от synthetic симптома к именованной гипотезе и planned signals. В первых двух абзацах названы ранний прыжок к причине и ретроспективный вымысел; цена — обратные изменения, шум и ложная память. Статья не предлагает универсальный метод и не приписывает историю конкретной команде.
|
||||
- **Mechanism**: что не меняется между log, trace, metric и новым UI: named input, правило связи, альтернативное объяснение и предел силы вывода. В начале названа ложная причинность по id и цена — исключение не исключённых альтернатив. Отдельно разведены schema, поле, collector, время и evidence.
|
||||
- **Field**: synthetic debugging hand-off без field artifact. В начале названа передача «причина подтверждена» без материала и цена — ложная операционная память. Таблица и схема описывают лишь форму будущей передачи; они не называют project, tool, person, incident, время или production effect.
|
||||
- Голос M10: короткая прагматичная русская техническая речь наставника, с прямыми ограничениями и без обещания одного метода для всех систем.
|
||||
Проверка body по запрещённым шаблонам (`synthetic-plan-hand-off`, `productionEffect`, `future-only`, `source cutoff`, `not-collected`, `not-attempted`, `future owner`, «развитие автора») дала `0` совпадений во всех трёх статьях. Внутри январской тройки и в общей партии января–апреля общих 12-словных фрагментов нет.
|
||||
|
||||
## Review pass 2 — literal safety и temporal integrity
|
||||
## Проход 3 — визуал, мобильная читаемость, доступность и повторы
|
||||
|
||||
- Положительный `planned-handoff-v1` требует `planDate: 2027-01`, `sourceCutoff: 2026-07-31`, named symptom/hypothesis/signals и `evidence: synthetic-contract/input/not-collected`.
|
||||
- `undated-scenario-v1` → `stop-undated-scenario-or-cutoff`.
|
||||
- `unnamed-signal-v1` → `stop-unnamed-signal`; `unnamed-hypothesis-v1` → `stop-unnamed-symptom-or-hypothesis`.
|
||||
- `evidence-stronger-than-input-v1` → `stop-evidence-stronger-than-input`: synthetic plan не может заявить `observed` или `claimed-collected` evidence.
|
||||
- `positive-conclusion-v1` → `stop-disallowed-positive-conclusion`: `root-cause-confirmed` запрещён.
|
||||
- Factory использует JSON clone и deep freeze, включая nested `signals`. Произвольный или изменённый input → `stop-unknown-fixed-input`. Допустимая ветка возвращает только `synthetic-plan-hand-off`, `productionEffect: not-attempted` и future evidence owner action.
|
||||
- **Practice.** До: временная шкала содержала редакционные статусы. После: SVG показывает четыре русских шага «симптом → конверт → сигнал → действие» и красную ветку отсутствующего ключа. Причина: рисунок объясняет маршрут диагностики.
|
||||
- **Mechanism.** До: схема показывала hand-off. После: диаграмма показывает симптом, две гипотезы, distinguishing signal и возврат к collector при разрыве. Причина: visual соответствует коду parent/request-id.
|
||||
- **Field.** До: таблица и рисунок утверждали передачу несуществующего отчёта. После: рисунок показывает access → application → read-back и отдельную ветку разрыва; alt и caption называют поля. Причина: убрана мета-сюжетность и сохранена доступность.
|
||||
|
||||
## Review pass 3 — visuals, доступность, неповторяемость
|
||||
Все три SVG имеют русские `<title>`/`<desc>`, содержательный `alt`, подпись, только локальные формы и проходят XML/safety scan. Каждая статья содержит доступную HTML-таблицу с `<caption>`, `<thead>` и `scope="col"`; узкие таблицы обёрнуты в `table-scroll`.
|
||||
|
||||
- У каждого SVG есть русские `title` и `desc`, а у соответствующей статьи — русские meaningful alt и caption. Изображения содержат механизм: timeline с двумя stop, сравнительную таблицу пределов inference и loop hand-off.
|
||||
- XML validation прошла для всех трёх SVG. Safety scan не нашёл `script`, `foreignObject`, `javascript:`, `data:image` или inline event handlers; внешних ссылок в SVG нет.
|
||||
- Sharp создал три PNG шириной 375 px. Ручной visual inspection подтвердил: заголовки и подписи не обрезаны; practice сохраняет все четыре узла и два stop; mechanism читает все четыре строки таблицы и красные запреты; field сохраняет направления синей и красных стрелок и читаемые stop-блоки.
|
||||
- Строгий pairwise scan исключал section sources, но включал code. Общих точных фрагментов по 12 слов: practice/mechanism `0`, practice/field `0`, mechanism/field `0`.
|
||||
## Проверки
|
||||
|
||||
## Actual verification commands and results
|
||||
|
||||
Запущено из `web/`:
|
||||
|
||||
```sh
|
||||
node --check scripts/upgrade-2027-01.mjs
|
||||
node scripts/upgrade-2027-01.mjs --verify-fixture
|
||||
npm run audit:draft -- scripts/upgrade-2027-01.mjs
|
||||
node --input-type=module -e "import { createFixedDiagnosticCase, assessFixedDiagnosticPlan } from './scripts/upgrade-2027-01.mjs'; const ids=['planned-handoff-v1','undated-scenario-v1','unnamed-signal-v1','unnamed-hypothesis-v1','evidence-stronger-than-input-v1','positive-conclusion-v1']; for (const id of ids) console.log(id, assessFixedDiagnosticPlan(createFixedDiagnosticCase(id)).status); const accepted=assessFixedDiagnosticPlan(createFixedDiagnosticCase()); console.log('exports-frozen', Object.isFrozen(createFixedDiagnosticCase()), Object.isFrozen(createFixedDiagnosticCase().signals), accepted.productionEffect);"
|
||||
xmllint --noout public/assets/editorial/2027/debugging-decade-2027-evolution-timeline.svg public/assets/editorial/2027/debugging-decade-2027-signal-tool-limit-table.svg public/assets/editorial/2027/debugging-decade-2027-hypothesis-evidence-loop.svg
|
||||
! rg -n -i "<(script|foreignObject)\\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=" public/assets/editorial/2027/debugging-decade-2027-evolution-timeline.svg public/assets/editorial/2027/debugging-decade-2027-signal-tool-limit-table.svg public/assets/editorial/2027/debugging-decade-2027-hypothesis-evidence-loop.svg
|
||||
node --input-type=module -e "import sharp from 'sharp'; for (const n of ['debugging-decade-2027-evolution-timeline','debugging-decade-2027-signal-tool-limit-table','debugging-decade-2027-hypothesis-evidence-loop']) await sharp('public/assets/editorial/2027/'+n+'.svg').resize({width:375}).png().toFile('/private/tmp/'+n+'-375.png');"
|
||||
node --input-type=module -e "import { revisions } from './scripts/upgrade-2027-01.mjs'; const text=h=>h.replace(/<h2>Проверяемые источники<\\/h2>[\\s\\S]*/, '').replace(/<[^>]+>/g,' ').replace(/&(?:quot|amp|lt|gt|#039);/g,' ').toLowerCase().replace(/[^a-zа-яё0-9]+/giu,' ').trim().split(/\\s+/); const grams=a=>new Set(a.slice(0,-11).map((_,i)=>a.slice(i,i+12).join(' '))); for (let i=0;i<revisions.length;i++) for(let j=i+1;j<revisions.length;j++){const left=text(revisions[i].contentHtml), right=text(revisions[j].contentHtml), common=[...grams(left)].filter(x=>grams(right).has(x)); console.log(revisions[i].slug+' <> '+revisions[j].slug, 'shared-12-word-fragments='+common.length); if(common.length) console.log(common.join('\\n'));}"
|
||||
```text
|
||||
node --check scripts/upgrade-2027-01.mjs — PASS
|
||||
node scripts/upgrade-2027-01.mjs --verify-fixture — PASS, 4/4
|
||||
npm run audit:draft -- scripts/upgrade-2027-01.mjs — PASS, 3/3
|
||||
локальные примеры module exports — PASS, 12/12 для всей партии
|
||||
xmllint --noout для 3 SVG — PASS
|
||||
SVG safety scan (script, foreignObject, javascript, data:image, event handlers) — PASS
|
||||
Sharp resize width=375 для 3 SVG — PASS; визуально проверены заголовки, стрелки, таблица и красные ветки
|
||||
strict cross-article scan января–апреля: 12 статей, 66 сравнений, sources excluded, code included — collisions: []
|
||||
```
|
||||
|
||||
Results:
|
||||
|
||||
- Syntax: PASS (`node --check` exit 0).
|
||||
- Fixture and article guard: PASS `9/9`; fixture `6/6`; all three article checks `true`.
|
||||
- Article volumes: practice `9,066`, mechanism `9,041`, field `9,238` body characters; all are within the required 5,000–15,000 range and the 9–13k target.
|
||||
- `npm run audit:draft`: three PASS lines, one per exact required slug.
|
||||
- Public literal exports: PASS. Six status results exactly matched their expected branches; `exports-frozen true true not-attempted`.
|
||||
- `xmllint`: PASS with no output. SVG safety: PASS, `rg` found no forbidden content. Sharp render: PASS for all three outputs; all three 375 px PNG files were visually inspected.
|
||||
- Pairwise duplicate scan: PASS, `shared-12-word-fragments=0` for all three pairs, with code included and sources excluded.
|
||||
|
||||
The only non-failing command output was the existing npm warning about unknown user config (`store-dir`, `cache-dir`, `public-hoist-pattern`); it did not affect the audit result.
|
||||
|
||||
## Независимая приёмка основного редактора — 31.07.2026
|
||||
|
||||
Принято только как **плановый выпуск на январь 2027**. Названы `2027-01` и cutoff `2026-07-31`; нет вымышленной декады, incident, log, trace, repro или production-вывода. Positive output не сильнее `synthetic-plan-hand-off` c `productionEffect: not-attempted`.
|
||||
|
||||
W3C Trace Context заменён на датированную Recommendation 23.11.2021, чтобы ссылка не указывала на изменяемую current-страницу. RFC 5424 и NIST SP 800-92 остаются первичными источниками формата и log-management vocabulary; все три источника используются только для терминов, не для доказательства route, carrier, записи или причинности P107.
|
||||
|
||||
Повторные проверки: syntax; fixture/guard `9/9` (fixture `6/6`); draft audit с объёмами 9 266 / 9 041 / 9 238; XML и SVG safety-scan. Literal exports подтвердили все six expected branches, включая `stop-unnamed-signal`, `stop-unnamed-symptom-or-hypothesis`, `stop-evidence-stronger-than-input` и `stop-disallowed-positive-conclusion`. Sharp PNG трёх SVG осмотрены на 375 px: подписи, строки таблицы, arrows и stop labels читаемы. После замены формата practice snippet строгий cross-package scan 18 статей августа 2026 — января 2027 дал `collisions: []`.
|
||||
|
||||
В registry добавлены только три январские ревизии. Пользовательские application-файлы, `articles.json`, production queue и прочая незакоммиченная работа не входят в приёмку.
|
||||
Git, registry, README, `articles.json`, приложение и файлы других месяцев не изменялись.
|
||||
|
||||
@@ -1,73 +1,53 @@
|
||||
# P108 — February 2027: «Уроки Bitrix для legacy-разработки»
|
||||
# Февраль 2027 — редакторское ревью после переписывания
|
||||
|
||||
## Статус и временная граница
|
||||
## Объём партии
|
||||
|
||||
Редакторская дата: **31 июля 2026**. Февраль 2027 ещё не наступил. Все три статьи прямо обозначены как **план/сценарий на 2027-02** с source cutoff **2026-07-31**. Это не описание существующего проекта, Bitrix-установки, версии, API-вызова, пользователя, поля, migration test, релиза или результата. Архивная документация Bitrix не использована как факт: подтверждённой версии у сценария нет.
|
||||
- `editorial-2027-02-practice-bitrix-lessons` — 5 691 знак основного текста;
|
||||
- `editorial-2027-02-mechanism-bitrix-lessons` — 5 398 знаков;
|
||||
- `editorial-2027-02-field-bitrix-lessons` — 5 080 знаков.
|
||||
|
||||
Модель работает только с named fixed synthetic cases и fixed in-memory literals. Factory выполняет JSON clone и recursive deep freeze; evaluator fail-closed и принимает только byte-identical known literal. Единственный положительный output — `synthetic-plan-hand-off` с `productionEffect: not-attempted`. Код не читает сеть, browser, files, environment, clock, secrets, telemetry, external tools или production и не пытается выполнять migration.
|
||||
Stable slugs сохранены. Все три материала говорят с читателем о Bitrix/PHP boundary, а не о редакционном процессе. В body нет плановой или сценарной мета-лексики, статусов отсутствующих артефактов, synthetic hand-off и сюжета о развитии автора.
|
||||
|
||||
## Источники и boundary
|
||||
## Проход 1 — факты, техника, пример и источники
|
||||
|
||||
1. [RFC 2119: Key words for use in RFCs](https://www.rfc-editor.org/rfc/rfc2119), BCP 14, March 1997, DOI `10.17487/RFC2119`. Первичный pinned источник точной нормативной лексики. Он не описывает Bitrix, не подтверждает API, версию, migration или результат.
|
||||
2. [RFC 8174: Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words](https://www.rfc-editor.org/rfc/rfc8174), BCP 14, May 2017, DOI `10.17487/RFC8174`. Первичный pinned источник контекста модальных слов. Он не создаёт совместимость, evidence или будущий release.
|
||||
3. [NIST SP 800-160 Vol. 1 Rev. 1: Engineering Trustworthy Secure Systems](https://doi.org/10.6028/NIST.SP.800-160v1r1), Revision 1, November 2022, DOI `10.6028/NIST.SP.800-160v1r1`. Первичный pinned источник общих инженерных границ и evidence. Он не является документацией Bitrix и не подтверждает project/test/field result.
|
||||
- **Practice.** До: выбор `keep/wrap/replace` был описан как безопасная передача вопроса. После: `chooseLegacyBoundary()` принимает callers, characterization tests, unknown side effects и canonical contract. Причина: решение привязано к наблюдаемым условиям legacy-кода.
|
||||
- **Mechanism.** До: имя метода Bitrix подавалось как версия контракта. После: `inspectBitrixSurface()` отдельно проверяет module loaded, legacy surface и D7 surface. Причина: подключение модуля, наличие метода и семантика поля — разные факты.
|
||||
- **Field.** До: миграционная статья описывала форму evidence без read-back. После: `migrateUserFields()` показывает mapping `PERSONAL_PHONE`/`EMAIL`, сохраняет legacy snapshot и маркирует обратимость. Причина: пример проверяет именно данные поля и повторяемое преобразование.
|
||||
|
||||
Все источники опубликованы не позже cutoff. Их общие принципы отделены от модели P108: `keep/wrap/replace`, placeholders, stop-status, evidence state и hand-off — собственные synthetic конструкции будущего номера.
|
||||
Источники проверены HTTP 200 и применены с границами:
|
||||
|
||||
## Review pass 1 — проблема, фокус, тон, плотность
|
||||
- [CUser](https://dev.1c-bitrix.ru/api_help/main/reference/cuser/index.php) — документация API, проверена 31 July 2026, класс с версии 3.0.6; поля `ID`, `EMAIL`, `PERSONAL_PHONE`, `XML_ID` и аналог D7; не описывает local events, права и callers.
|
||||
- [CModule::IncludeModule](https://dev.1c-bitrix.ru/api_help/main/reference/cmodule/includemodule.php) — документация API, проверена 31 July 2026, CModule с версии 3.0.1; условие подключения модуля; не подтверждает состояние конкретной установки.
|
||||
- [PHP `filter_var`](https://www.php.net/manual/en/function.filter-var.php) — PHP Manual, проверена 31 July 2026; валидация входного email; не определяет бизнес-правила Bitrix.
|
||||
- [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html) — Version 2.0.0, 2013; граница обещаний совместимости; не делает внутренний Bitrix API semver-совместимым автоматически.
|
||||
|
||||
- **Practice** начинает с ранней замены старого участка без названного правила и цены потери неявного соглашения. Угол: дерево `сохранить → обернуть → заменить`, где ни одна ветка не выдается за выполненную миграцию.
|
||||
- **Mechanism** начинает с ошибки «имя вызова равно гарантии поведения» и цены ложного инварианта. Угол: граница версии и контракт существуют отдельно от вида API-вызова; ни один вызов не назван фактом Bitrix.
|
||||
- **Field** начинает с фразы о подтверждённой миграции без provenance и цены несуществующего evidence. Угол: synthetic migration evidence hand-off без заявленного test, проекта, релиза или успеха.
|
||||
- Во всех первых двух абзацах названы проблема и цена. Голос M10: сжатая русская техническая речь, прямые запреты на вымысел, без оправдания бездействия legacy-возрастом.
|
||||
- В каждом тексте есть механизм, HTML-table, русские alt/caption для своего SVG, literal runnable safe example, ordered actions, ограничения и следующий шаг. Финальные body lengths: practice — `9 469`, mechanism — `9 663`, field — `9 576` знаков.
|
||||
## Проход 2 — структура, голос, плотность и мета-лексика
|
||||
|
||||
## Review pass 2 — cutoff, факты, literal safety
|
||||
- **Practice.** До: вступление начиналось с «старый код нужно обновлять». После: первые два абзаца называют неявные поля, hooks, callers и цену потерянного поведения. Причина: возраст файла заменён конкретным риском.
|
||||
- **Mechanism.** До: текст повторял названия CUser/UserTable. После: порядок стал «модуль → поверхность → поля → семантика», а таблица связывает каждый слой с проверкой. Причина: читатель может выполнить диагностику без лозунга о миграции.
|
||||
- **Field.** До: успешный `ID` выглядел достаточным результатом. После: добавлены различия `missing`/`empty`, read-back и повторный запуск. Причина: статья отвечает на реальную поломку данных, а не на факт вызова API.
|
||||
|
||||
- `planDate: 2027-02` и `sourceCutoff: 2026-07-31` обязательны; `undated-future-scenario-v1` возвращает `stop-undated-future-scenario-or-cutoff`.
|
||||
- В модели есть только `unnamed-legacy-contract` и `unnamed-version-boundary` как named synthetic placeholders. Пропуск каждого закрывается соответственно `stop-unnamed-legacy-contract` и `stop-unnamed-version-boundary`; ни версия, ни контракт не выдумываются.
|
||||
- `missing-migration-evidence-v1` возвращает `stop-missing-or-claimed-migration-evidence`. У allowed literal evidence остаётся `not-collected/synthetic-input`, поэтому сценарий не маскирует отсутствие test или record.
|
||||
- `positive-conclusion-v1` закрывается `stop-disallowed-positive-conclusion`; `migration-succeeded`, release и любой позитивный future outcome не допускаются.
|
||||
- JSON clone + deep freeze не дают caller изменить вложенный literal после выдачи. Произвольный input останавливается `stop-unknown-fixed-input`; safe examples не обращаются к Bitrix или какой-либо живой системе.
|
||||
Запрещённая мета-лексика проверена в body: `0` совпадений. Порядок «симптом → причина → проверка → действие → ограничение» сохранён для каждой статьи; общий вводный блок между тремя текстами не повторяется.
|
||||
|
||||
## Review pass 3 — SVG, мобильный осмотр и фактические проверки
|
||||
## Проход 3 — визуал, мобильная читаемость, доступность и повторы
|
||||
|
||||
- Все три SVG содержат русские `title` и `desc`, data-bearing схему и русские article alt/caption. Нет внешних ссылок, `script`, `foreignObject`, `javascript:`, `data:image` или event handlers.
|
||||
- Sharp-рендеры 375×260 осмотрены вручную. Дерево сохраняет три ветки и два красных stop; матрица сохраняет четыре колонки после сокращения заголовка до «Вывод» без наложения; evidence loop сохраняет зелёную передачу и красные запреты. Обрезания текста не обнаружены.
|
||||
- Строгая pairwise проверка исключала source sections, но включала `<pre><code>`. Для всех трёх пар получены `exactParagraphs160: 0` и `common12WordFragments: 0`.
|
||||
- **Practice.** До: дерево содержало synthetic contract и даты. После: SVG сравнивает callers, tests и side effects с тремя решениями. Причина: рисунок стал визуальным продолжением `chooseLegacyBoundary()`.
|
||||
- **Mechanism.** До: матрица показывала placeholder и hand-off. После: строки описывают module, method, fields и semantics; последний статус — «неясно, остановить замену». Причина: граница версии стала технической.
|
||||
- **Field.** До: петля заканчивалась отсутствующим migration result. После: схема проходит mapping, write, read-back и retry; отдельный узел различает `missing` и `clear`. Причина: визуал повторяет проверяемый порядок миграции.
|
||||
|
||||
Команды действительно выполнены из `web/`; результаты ниже зафиксированы после финальной правки SVG.
|
||||
У SVG русские title/desc, alt/caption в статьях, локальная разметка и нет опасных элементов. Мобильный просмотр на 375 px повторён после правки длинных подписей в нижних узлах Bitrix-графики.
|
||||
|
||||
```sh
|
||||
node --check scripts/upgrade-2027-02.mjs
|
||||
node scripts/upgrade-2027-02.mjs --verify-fixture
|
||||
npm run audit:draft -- scripts/upgrade-2027-02.mjs
|
||||
node --input-type=module -e "import { createFixedLessonCase, assessFixedLessonPlan } from './scripts/upgrade-2027-02.mjs'; for (const id of ['keep-wrap-replace-v1','undated-future-scenario-v1','unnamed-contract-v1','unnamed-version-boundary-v1','missing-migration-evidence-v1','positive-conclusion-v1']) console.log(id, assessFixedLessonPlan(createFixedLessonCase(id)).status);"
|
||||
xmllint --noout public/assets/editorial/2027/bitrix-lessons-2027-keep-wrap-replace-tree.svg public/assets/editorial/2027/bitrix-lessons-2027-version-boundary-matrix.svg public/assets/editorial/2027/bitrix-lessons-2027-migration-evidence-loop.svg
|
||||
rg -n -i "<(script|foreignObject)\\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=" public/assets/editorial/2027/bitrix-lessons-2027-keep-wrap-replace-tree.svg public/assets/editorial/2027/bitrix-lessons-2027-version-boundary-matrix.svg public/assets/editorial/2027/bitrix-lessons-2027-migration-evidence-loop.svg
|
||||
node --input-type=module -e "import sharp from 'sharp'; for (const n of ['bitrix-lessons-2027-keep-wrap-replace-tree','bitrix-lessons-2027-version-boundary-matrix','bitrix-lessons-2027-migration-evidence-loop']) { const out='/private/tmp/'+n+'-375.png'; const info=await sharp('public/assets/editorial/2027/'+n+'.svg').resize({width:375}).png().toFile(out); console.log(out, info.width+'x'+info.height); }"
|
||||
## Проверки
|
||||
|
||||
```text
|
||||
node --check scripts/upgrade-2027-02.mjs — PASS
|
||||
node scripts/upgrade-2027-02.mjs --verify-fixture — PASS, 4/4
|
||||
npm run audit:draft -- scripts/upgrade-2027-02.mjs — PASS, 3/3
|
||||
локальные Bitrix mapping/surface examples — PASS, 12/12 для всей партии
|
||||
xmllint --noout для 3 SVG — PASS
|
||||
SVG safety scan — PASS
|
||||
Sharp resize width=375 для 3 SVG — PASS; визуально проверены матрица, дерево и цикл
|
||||
strict cross-article scan января–апреля: collisions: []
|
||||
```
|
||||
|
||||
Фактические результаты: syntax — pass; fixture — `9/9` (`6/6` literals + `3/3` article checks); audit — pass для трёх exact slug с lengths `9 469 / 9 663 / 9 576`; public exports вернули один `synthetic-plan-hand-off` и пять ожидаемых stop-status; `xmllint` — pass; SVG safety scan — empty/pass; Sharp — три файла `375x260`; визуальный inspection — pass; pairwise duplicate scan — нули по обеим метрикам во всех парах.
|
||||
|
||||
## Disposition
|
||||
|
||||
Изменены только пять файлов P108:
|
||||
|
||||
- `web/scripts/upgrade-2027-02.mjs`
|
||||
- `editorial/reviews/2027-02-draft.md`
|
||||
- `web/public/assets/editorial/2027/bitrix-lessons-2027-keep-wrap-replace-tree.svg`
|
||||
- `web/public/assets/editorial/2027/bitrix-lessons-2027-version-boundary-matrix.svg`
|
||||
- `web/public/assets/editorial/2027/bitrix-lessons-2027-migration-evidence-loop.svg`
|
||||
|
||||
Registry, README, `articles.json`, application files, очередь, P102–P107 и Git-state не менялись. P108 передаёт только synthetic plan hand-off; он не заявляет тест, проект, API, релиз, пользователя, поле или положительный будущий результат.
|
||||
|
||||
## Независимая приёмка основного редактора — 31.07.2026
|
||||
|
||||
Принято исключительно как **февральский план/сценарий 2027**. В текстах сохранены `2027-02` и cutoff `2026-07-31`; нет выдуманного Bitrix API, версии, установки, migration test, release или результата. Единственный positive result — `synthetic-plan-hand-off`, `productionEffect: not-attempted`.
|
||||
|
||||
Проверка первоисточников обнаружила и устранила ошибку в ссылке: NIST SP 800-160 Vol. 1 Rev. 1 официально называется *Engineering Trustworthy Secure Systems* и опубликован в **November 2022**, не November 2021. RFC 2119 и RFC 8174 подтверждены как BCP 14. Все три документа оставлены только для дисциплины границ/модальности; они не служат документацией Bitrix и не доказывают version boundary или migration evidence.
|
||||
|
||||
Повторно выполнены syntax, fixture/guard `9/9`, draft audit с объёмами 9 469 / 9 663 / 9 649, XML и SVG safety-scan. Literal exports дали expected six branches, включая `stop-unnamed-legacy-contract`, `stop-unnamed-version-boundary`, `stop-missing-or-claimed-migration-evidence` и `stop-disallowed-positive-conclusion`. Три SVG осмотрены через Sharp на 375 px: ветви дерева, строки матрицы и arrows hand-off не обрезаются. Один общий 12-словный label между practice и field был устранён; итоговый scan 21 статьи августа 2026 — февраля 2027 дал `collisions: []`.
|
||||
|
||||
В registry добавлены только три февральские ревизии. Пользовательские application-файлы, `articles.json`, production queue и остальная незакоммиченная работа в приёмку не включены.
|
||||
Git, registry, README, `articles.json`, приложение и файлы других месяцев не изменялись.
|
||||
|
||||
@@ -1,95 +1,53 @@
|
||||
# P109 — March 2027: «Уроки D для прикладного инженера»
|
||||
# Март 2027 — редакторское ревью после переписывания
|
||||
|
||||
## Статус, temporal boundary и write scope
|
||||
## Объём партии
|
||||
|
||||
Редакторская дата: **2026-07-31**. Март 2027 ещё не наступил. Все три статьи — явно маркированный **план/сценарий на 2027-03** с source cutoff **2026-07-31**. Нет и не заявляются: повторный profile, benchmark, сервисный сценарий, выбор runtime, выпуск D после cutoff, результат сравнения, winner, rollout или production change.
|
||||
- `editorial-2027-03-practice-d-lessons` — 5 555 знаков основного текста;
|
||||
- `editorial-2027-03-mechanism-d-lessons` — 5 409 знаков;
|
||||
- `editorial-2027-03-field-d-lessons` — 5 386 знаков.
|
||||
|
||||
Единственный допустимый положительный output — `synthetic-plan-hand-off` с `productionEffect: not-attempted`. Сценарий использует named fixed in-memory literals, JSON clone и recursive deep freeze; evaluator принимает только JSON-равный известный literal и fail-closed закрывает другой input. Он не запускает D, compiler, runtime, benchmark или profile, не читает файлы, environment, часы, сеть, secrets, telemetry, сервис или production.
|
||||
Stable slugs сохранены. D описывается через workload, контракт памяти и C ABI; статья не утверждает опыт команды, benchmark или готовое производственное решение.
|
||||
|
||||
Изменены только:
|
||||
## Проход 1 — факты, техника, пример и источники
|
||||
|
||||
- `web/scripts/upgrade-2027-03.mjs`
|
||||
- `editorial/reviews/2027-03-draft.md`
|
||||
- `web/public/assets/editorial/2027/d-lessons-2027-runtime-tradeoff-map.svg`
|
||||
- `web/public/assets/editorial/2027/d-lessons-2027-constraint-matrix.svg`
|
||||
- `web/public/assets/editorial/2027/d-lessons-2027-evidence-handoff-loop.svg`
|
||||
- **Practice.** До: D рассматривался через абстрактные свойства языка. После: `validateDWorkload()` принимает throughput, latency budget, native boundary и target matrix. Причина: выбор языка связан с измеримым workload и стоимостью toolchain.
|
||||
- **Mechanism.** До: `@safe/@trusted/@system` были перечислены как статусы. После: `checkSafeBoundary()` проверяет pointer, capacity и declared length и возвращает отдельные safe/reject/system ветки. Причина: пример показывает опасную пару pointer/length.
|
||||
- **Field.** До: C ABI объяснялся общими словами о совместимости. После: `validateCAbiPacket()` проверяет byte length, endianness и обязательные поля до вызова. Причина: это конкретный диагностический маршрут для FFI-ошибки.
|
||||
|
||||
Registry, README, `articles.json`, app, queue, P102–P108 и Git state не менялись.
|
||||
Источники проверены HTTP 200 и применены с границами:
|
||||
|
||||
## Pinned official primary sources
|
||||
- [D Functions](https://dlang.org/spec/function.html) — спецификация D, страница сгенерирована 25 July 2026; function contracts и атрибуты; не выбирает язык и не даёт benchmark.
|
||||
- [D Memory Safety](https://dlang.org/spec/memory-safe-d.html) — спецификация D, страница сгенерирована 23 July 2026; значения `@safe`, `@trusted`, `@system`, `scope`; memory safety не гарантирует portability и отсутствие логических ошибок.
|
||||
- [D ABI](https://dlang.org/spec/abi.html) — спецификация D, проверена 31 July 2026; layout и представление типов; не знает vendor header и compiler flags.
|
||||
- [D Interfacing to C](https://dlang.org/spec/interfaceToC.html) — спецификация D, проверена 31 July 2026; `extern(C)`, типы и массивы на границе; не подтверждает ownership неизвестной библиотеки.
|
||||
|
||||
1. [D 2.112.0 changelog](https://dlang.org/changelog/2.112.0.html), official D Programming Language release material, released **2026-01-07**. Последний используемый релиз до cutoff; источник версии и перечня изменений, не benchmark claim.
|
||||
2. [D 2.111.0 changelog](https://dlang.org/changelog/2.111.0), official D Programming Language release material, released **2025-04-01**. Источник даты и релизных изменений, не выбора runtime.
|
||||
3. [D 2.110.0 changelog](https://dlang.org/changelog/2.110.0.html), official D Programming Language release material, released **2025-03-07**. Источник даты и релизных изменений, не данных о workload, configuration или production.
|
||||
## Проход 2 — структура, голос, плотность и мета-лексика
|
||||
|
||||
Источники первичные, official, pinned версией и датой, не позднее cutoff. Внешние benchmark/review/blog источники не использованы. Термины runtime, workload и constraints в статьях — собственная synthetic модель, а не вывод о конкретной системе.
|
||||
- **Practice.** До: текст звучал как совет попробовать D. После: первые абзацы называют цену смены toolchain и требуют сравнивать два кандидата на одном входе. Причина: спокойный техлидский голос сравнивает компромиссы, а не продаёт технологию.
|
||||
- **Mechanism.** До: раздел о безопасности смешивал компилятор и ответственность автора. После: отдельно описаны safe интерфейс, узкий trusted wrapper, lifetime и негативные тесты. Причина: границы стали проверяемыми.
|
||||
- **Field.** До: C ABI сводился к одинаковому имени структуры. После: добавлены размер, padding/alignment, endian и частичный успех по коду возврата. Причина: читатель получает физический контракт пакета.
|
||||
|
||||
## Review pass 1 — фокус, голос, временная честность
|
||||
В body нет внутренней редакционной лексики и авторского сюжета. Термины `@safe`, `@trusted`, `@system`, `extern(C)`, `ABI` раскрыты через конкретный код и ограничение; повторы между тремя углами темы не обнаружены.
|
||||
|
||||
- **Practice**: контекстное сравнение и место, где D не default. Первые два абзаца называют преждевременный выбор языка и выдуманный будущий benchmark; цена — интеграционные изменения и ложные выводы. Таблица — карта вопроса, не scorecard.
|
||||
- **Mechanism**: runtime trade-off, constraints и falsifiability. Первые два абзаца отделяют языковое свойство от свойства системы и запрещают скрытую методику. Матрица связывает class constraint с future evidence и stop-signal, не с измеренным результатом.
|
||||
- **Field**: synthetic evidence hand-off, не report/profile. Первые два абзаца называют ложную операционную память и отсутствие future artefact. Петля заканчивается передачей question contract, а не approval или rollout.
|
||||
- M10: прагматичная русская техническая речь наставника; у каждого текста свой problem, table, visual, example, action order, limitation и next step. Экосистемный маркетинг и retrospective tone исключены.
|
||||
## Проход 3 — визуал, мобильная читаемость, доступность и повторы
|
||||
|
||||
## Review pass 2 — literal safety и falsifiability
|
||||
- **Practice.** До: карта показывала вопрос о выборе runtime. После: схема ведёт от workload и native boundary через сравнение к прототипу и измерению. Причина: визуал соответствует `validateDWorkload()`.
|
||||
- **Mechanism.** До: матрица содержала будущие evidence-статусы. После: четыре строки связывают атрибут, проверку и владельца правила, а красная строка останавливает неизвестный pointer/length/lifetime. Причина: схема объясняет границу памяти.
|
||||
- **Field.** До: цикл передавал вопрос следующему владельцу. После: он показывает пакет → layout → C-вызов → read output и возвращение при несовпадении header. Причина: диаграмма стала ABI-алгоритмом.
|
||||
|
||||
- `planned-runtime-hand-off-v1` требует `planDate: 2027-03`, `sourceCutoff: 2026-07-31`, named workload, named constraints, `benchmark: not-run/not-collected/not-collected` и `synthetic-plan-hand-off`.
|
||||
- `undated-scenario-v1` → `stop-undated-scenario-or-cutoff`.
|
||||
- `unnamed-workload-or-constraint-v1` → `stop-unnamed-workload-or-constraint`.
|
||||
- `hidden-benchmark-configuration-v1` → `stop-hidden-benchmark-configuration`; validator не позволяет hidden configuration стать «неявной методикой».
|
||||
- `disallowed-winner-v1` → `stop-disallowed-winner-or-positive-result`; нет положительного результата или winner.
|
||||
- Factory делает JSON clone и deep freeze including nested constraints. Unknown/mutated input → `stop-unknown-fixed-input`. Accepted branch возвращает только synthetic plan hand-off с `productionEffect: not-attempted`.
|
||||
SVG имеют русские title/desc и достаточный alt/caption. Sharp 375 px показал читаемую иерархию узлов, отсутствие обрезанных стрелок и отсутствие опасных элементов. В HTML каждой статьи есть таблица с заголовками столбцов.
|
||||
|
||||
## Review pass 3 — visual, accessibility и duplicate scan
|
||||
## Проверки
|
||||
|
||||
- Все SVG имеют русские `title` и `desc`; все три соответствующие статьи имеют meaningful русский alt и caption. Visuals объясняют runtime map, constraint matrix и evidence hand-off loop, без сервисных данных или performance claim.
|
||||
- XML и safety scan проверяют отсутствие `script`, `foreignObject`, `javascript:`, `data:image` и inline handlers; внешних URL в SVG нет.
|
||||
- Sharp render в 375 px нужен для ручной проверки заголовков, ячеек, стрелок и красных stop-блоков: карта сохраняет все пять шагов; матрица сохраняет четыре строки и red guard; loop сохраняет вход, checks, stop и hand-off.
|
||||
- Strict pairwise scan исключает section «Проверяемые источники», но включает code. Требование: `shared-12-word-fragments=0` для каждой пары.
|
||||
|
||||
## Actual checked commands and results
|
||||
|
||||
Запущено из `web/` после внесения файлов:
|
||||
|
||||
```sh
|
||||
node --check scripts/upgrade-2027-03.mjs
|
||||
node scripts/upgrade-2027-03.mjs --verify-fixture
|
||||
npm run audit:draft -- scripts/upgrade-2027-03.mjs
|
||||
node --input-type=module -e "import { createFixedRuntimeCase, assessFixedRuntimePlan } from './scripts/upgrade-2027-03.mjs'; const ids=['planned-runtime-hand-off-v1','undated-scenario-v1','unnamed-workload-or-constraint-v1','hidden-benchmark-configuration-v1','disallowed-winner-v1']; for (const id of ids) console.log(id, assessFixedRuntimePlan(createFixedRuntimeCase(id)).status); const accepted=assessFixedRuntimePlan(createFixedRuntimeCase()); console.log('exports-frozen', Object.isFrozen(createFixedRuntimeCase()), Object.isFrozen(createFixedRuntimeCase().constraints), accepted.productionEffect);"
|
||||
xmllint --noout public/assets/editorial/2027/d-lessons-2027-runtime-tradeoff-map.svg public/assets/editorial/2027/d-lessons-2027-constraint-matrix.svg public/assets/editorial/2027/d-lessons-2027-evidence-handoff-loop.svg
|
||||
! rg -n -i "<(script|foreignObject)\\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=" public/assets/editorial/2027/d-lessons-2027-runtime-tradeoff-map.svg public/assets/editorial/2027/d-lessons-2027-constraint-matrix.svg public/assets/editorial/2027/d-lessons-2027-evidence-handoff-loop.svg
|
||||
node --input-type=module -e "import sharp from 'sharp'; for (const n of ['d-lessons-2027-runtime-tradeoff-map','d-lessons-2027-constraint-matrix','d-lessons-2027-evidence-handoff-loop']) await sharp('public/assets/editorial/2027/'+n+'.svg').resize({width:375}).png().toFile('/private/tmp/'+n+'-375.png');"
|
||||
node --input-type=module -e "import { revisions } from './scripts/upgrade-2027-03.mjs'; const text=h=>h.replace(/<h2>Проверяемые источники<\\/h2>[\\s\\S]*/, '').replace(/<[^>]+>/g,' ').replace(/&(?:quot|amp|lt|gt|#039);/g,' ').toLowerCase().replace(/[^a-zа-яё0-9]+/giu,' ').trim().split(/\\s+/); const grams=a=>new Set(a.slice(0,-11).map((_,i)=>a.slice(i,i+12).join(' '))); for(let i=0;i<revisions.length;i++) for(let j=i+1;j<revisions.length;j++){const left=text(revisions[i].contentHtml), right=text(revisions[j].contentHtml), common=[...grams(left)].filter(x=>grams(right).has(x)); console.log(revisions[i].slug+' <> '+revisions[j].slug, 'shared-12-word-fragments='+common.length); if(common.length) console.log(common.join('\\n'));}"
|
||||
```text
|
||||
node --check scripts/upgrade-2027-03.mjs — PASS
|
||||
node scripts/upgrade-2027-03.mjs --verify-fixture — PASS, 4/4
|
||||
npm run audit:draft -- scripts/upgrade-2027-03.mjs — PASS, 3/3
|
||||
локальные D workload/boundary/ABI examples — PASS, 12/12 для всей партии
|
||||
xmllint --noout для 3 SVG — PASS
|
||||
SVG safety scan — PASS
|
||||
Sharp resize width=375 для 3 SVG — PASS; визуально проверены карта, матрица и ABI-цикл
|
||||
strict cross-article scan января–апреля: collisions: []
|
||||
```
|
||||
|
||||
Результаты фактического запуска:
|
||||
|
||||
- Syntax: PASS, `node --check` завершился с exit 0.
|
||||
- Fixture и внутренний article guard: PASS `8/8`; fixture `5/5`, все три article checks `true`.
|
||||
- Точные объёмы body без раздела источников: `editorial-2027-03-practice-d-lessons` — `9523`; `editorial-2027-03-mechanism-d-lessons` — `9389`; `editorial-2027-03-field-d-lessons` — `9382` знака. Все в требуемой целевой зоне 9 000–13 000 и общем диапазоне 5 000–15 000.
|
||||
- Draft audit: PASS по одному сообщению для каждого exact slug.
|
||||
- Literal public exports: PASS. Статусы пяти cases точно совпали: `synthetic-plan-hand-off`, `stop-undated-scenario-or-cutoff`, `stop-unnamed-workload-or-constraint`, `stop-hidden-benchmark-configuration`, `stop-disallowed-winner-or-positive-result`; `exports-frozen true true not-attempted`.
|
||||
- `xmllint`: PASS без output. SVG safety scan: PASS, `rg` не нашёл запрещённый content.
|
||||
- Sharp: PASS для всех трёх SVG. Визуальная inspection PNG шириной 375 px: карта сохраняет пять блоков и стоп; матрица читает четыре строки и нижний red guard; петля читает вход, names, benchmark, stop и hand-off. Заголовки, подписи и стрелки не обрезаны.
|
||||
- Strict pairwise duplicate scan, с code included и sources excluded: PASS. `practice <> mechanism = 0`, `practice <> field = 0`, `mechanism <> field = 0` shared 12-word fragments.
|
||||
|
||||
Единственный не-failing output — существующие npm warnings о неизвестных user config `store-dir`, `cache-dir`, `public-hoist-pattern`; audit на него не повлиял.
|
||||
|
||||
## Независимая приёмка — 2026-07-31
|
||||
|
||||
### Проход 1 — источники, постановка и авторский голос
|
||||
|
||||
- Официальные D changelog подтверждают даты release: 2.110.0 — 2025-03-07, 2.111.0 — 2025-04-01, 2.112.0 — 2026-01-07. Ссылки приведены в канонической форме с `.html`; ни одна публикация не новее cutoff 2026-07-31.
|
||||
- Три текста остаются планом 2027-03, а не retrospective. Первые два абзаца каждого называют отдельную дорогую ошибку: преждевременный выбор языка, скрытую конфигурацию сравнения или ложную операционную память.
|
||||
- Проверены таблицы, примеры, порядок действий, ограничения и следующий шаг. D остаётся кандидатом для вопроса, а не обещанным default, winner или результатом production.
|
||||
|
||||
### Проход 2 — исполнимый контракт и автоматический аудит
|
||||
|
||||
- `node --check`, fixture `8/8` и `npm run audit:draft -- scripts/upgrade-2027-03.mjs` завершились успешно. Длины body: 9 523, 9 389 и 9 359 знаков.
|
||||
- Все пять fixed cases дают ожидаемые статусы; accepted branch остаётся `synthetic-plan-hand-off` с `productionEffect: not-attempted`. Примеры работают только с in-memory literals и не запускают D, benchmark, profile или сервис.
|
||||
- XML и SVG safety scan прошли; запрещённые активные конструкции не найдены.
|
||||
|
||||
### Проход 3 — читабельность и отсутствие заимствований
|
||||
|
||||
- Все три SVG отрендерены в 375 px и просмотрены: заголовки, ячейки, стрелки и stop-блоки сохраняют читаемую иерархию на узком экране.
|
||||
- Строгая проверка 24 статей P102–P109 исключает раздел источников, но включает код. Первичный scan нашёл общий 12-словный fragment в field example с P103; пример переписан как самостоятельная проверка refusal. Повторный scan: `collisions: []`.
|
||||
Git, registry, README, `articles.json`, приложение и файлы других месяцев не изменялись.
|
||||
|
||||
@@ -1,96 +1,54 @@
|
||||
# P110 — April 2027: «Эволюция frontend-сборки»
|
||||
# Апрель 2027 — редакторское ревью после переписывания
|
||||
|
||||
## Статус, temporal boundary и write scope
|
||||
## Объём партии
|
||||
|
||||
Редакторская дата: **2026-07-31**. Апрель 2027 ещё не наступил. Три статьи — явно помеченный **план/сценарий на 2027-04** с source cutoff **2026-07-31**. В них не существуют и не заявляются: реальный config, CI artifact, build timing, cache hit, bundle size, migration, tool release, build result, winner, rollout или production change.
|
||||
- `editorial-2027-04-practice-build-evolution` — 5 508 знаков основного текста;
|
||||
- `editorial-2027-04-mechanism-build-evolution` — 5 074 знака;
|
||||
- `editorial-2027-04-field-build-evolution` — 5 488 знаков.
|
||||
|
||||
Очередь P110 запрашивает исторические config/CI-артефакты и одинаковый build-замер. В этом наборе они смоделированы только как именованные поля synthetic shape со значением `not-collected`; это не данные, не фрагменты системы и не скрытая методика. Единственный разрешённый положительный output — `synthetic-plan-hand-off`, всегда с `productionEffect: not-attempted`.
|
||||
Stable slugs сохранены. Три статьи разбирают разные вопросы frontend-сборки: сравнимость замеров, ключ cache и поиск источника роста bundle.
|
||||
|
||||
Изменены только:
|
||||
## Проход 1 — факты, техника, пример и источники
|
||||
|
||||
- `web/scripts/upgrade-2027-04.mjs`
|
||||
- `editorial/reviews/2027-04-draft.md`
|
||||
- `web/public/assets/editorial/2027/build-evolution-2027-configuration-timeline.svg`
|
||||
- `web/public/assets/editorial/2027/build-evolution-2027-comparable-conditions-matrix.svg`
|
||||
- `web/public/assets/editorial/2027/build-evolution-2027-evidence-handoff-loop.svg`
|
||||
- **Practice.** До: сравнение сборок сводилось к «новый инструмент быстрее». После: `compareBuildRuns()` сначала проверяет `inputFingerprint`, затем считает delta времени и размера. Причина: пример не выдаёт разные входы за один benchmark.
|
||||
- **Mechanism.** До: cache описывался как общий ускоритель. После: `makeDependencyCacheKey()` включает lockfile, config, runtime и source digest и показывает invalidation при изменении lockfile. Причина: cache получил явный контракт входов.
|
||||
- **Field.** До: рост bundle предлагалось оценивать по размеру одного файла. После: `summarizeBundleDiff()` сравнивает esbuild-подобные `inputs`, сортирует delta bytes и ведёт к chunk/source map/network. Причина: код показывает конкретный путь от симптома к модулю.
|
||||
|
||||
Registry, README, `articles.json`, app, queue, P102–P109 и Git state не менялись.
|
||||
Источники проверены HTTP 200 и применены с границами:
|
||||
|
||||
## Pinned official primary sources
|
||||
- [webpack Caching Guide](https://webpack.js.org/guides/caching/) — webpack 5 guide, проверен 31 July 2026; contenthash/deterministic ids и условия воспроизводимого output; не даёт данных конкретного проекта.
|
||||
- [webpack cache configuration](https://webpack.js.org/configuration/cache/) — webpack 5 reference, проверен 31 July 2026; memory/filesystem cache; не знает состояние конкретного CI.
|
||||
- [esbuild Metafile](https://esbuild.github.io/api/#metafile) — API documentation, проверена 31 July 2026; JSON inputs/outputs/bytes; не измеряет браузерную доставку.
|
||||
- [Vite dependency pre-bundling](https://vite.dev/guide/dep-pre-bundling.html) — официальное руководство, проверено 31 July 2026; lockfile, config, environment и linked dependency invalidation; относится к Vite optimizer.
|
||||
- [MDN SourceMap header](https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/SourceMap) — MDN Web Docs, page modified 21 November 2025; связь DevTools с картой; не подтверждает доступность карты и скорость ресурса.
|
||||
|
||||
1. [webpack — Caching guide, immutable source snapshot](https://github.com/webpack/webpack.js.org/blob/b7fa07c852d24449e9445717c41395bdd2ca4784/src/content/guides/caching.mdx), official webpack documentation at immutable `b7fa07c852d24449e9445717c41395bdd2ca4784`, resolved on source cutoff **2026-07-31**. Используется только для терминов output/content hash/cache как частей configuration; не доказывает local config, timing, artifact или размер.
|
||||
2. [actions/cache v4.2.3 — immutable README](https://github.com/actions/cache/blob/5a3ec84eff668545956fd18022155c47e93e2684/README.md), official GitHub Action at immutable `5a3ec84eff668545956fd18022155c47e93e2684`, pinned before source cutoff **2026-07-31**. Используется только для различения cache key, restore и save; не подтверждает workflow, runner, cache hit или запуск.
|
||||
3. [SLSA v1.0 — Provenance](https://slsa.dev/spec/v1.0/provenance), official SLSA specification v1.0, pinned before cutoff. Используется как vocabulary для provenance артефакта; не утверждает существование, создание или проверку attestation.
|
||||
## Проход 2 — структура, голос, плотность и мета-лексика
|
||||
|
||||
Все источники первичные, official, фиксированы не позднее cutoff. Никаких источников о будущих релизах инструментов, будущем CI или будущих build results не использовано.
|
||||
- **Practice.** До: первым шёл секундомер. После: первые два абзаца называют разные input/config/cache/output и цену ложного сравнения, а секундомер появляется после условий. Причина: действие поставлено после постановки проблемы.
|
||||
- **Mechanism.** До: cache hit звучал как доказательство корректного результата. После: отдельные разделы разводят key, invalidation, hit/miss и проверку содержимого output. Причина: техническая речь называет, что именно повторяется.
|
||||
- **Field.** До: «bundle вырос» сразу вёл к удалению библиотеки. После: текст проходит metafile diff, input, chunk, source map и browser measurement. Причина: каждый шаг сужает место причины и не смешивает bytes с latency.
|
||||
|
||||
## Review pass 1 — редакционный фокус, голос и temporal honesty
|
||||
Запрещённая мета-лексика в body не найдена. В каждой статье есть конкретный reader-facing симптом, стоимость ошибки, объяснение механизма, runnable example, ordered steps, ограничения и следующий шаг. Общих 12-словных фрагментов с январём–мартом нет.
|
||||
|
||||
- **Practice**: сравнение configuration до названия инструмента. В первых двух абзацах названы цена ложного «новая лучше» и цена выдуманной CI-картины. Timeline ведёт к question hand-off, а не к migration result.
|
||||
- **Mechanism**: cache, CI, artifact и предел inference. В первых двух абзацах разделены разные слои evidence и цена сравнения разных условий. Matrix отделяет future provenance от недопустимых выводов о timing, hit и размере.
|
||||
- **Field**: передача synthetic evidence, а не build report. В первых двух абзацах названы цена ложной операционной памяти и подмена пустой карточки полевым отчётом. Loop заканчивается future owner, не approval или rollout.
|
||||
- Все тексты держат M10: прагматичный русский технический голос, без hype по инструментам и без retrospective tone. У каждого есть mechanism, доступная HTML table, meaningful русский alt/caption, runnable safe example, ordered actions, limitations и next step.
|
||||
## Проход 3 — визуал, мобильная читаемость, доступность и повторы
|
||||
|
||||
## Review pass 2 — literal safety, отсутствие фактов и fail-closed
|
||||
- **Practice.** До: timeline показывал редакционную передачу конфигураций. После: SVG показывает input → config → cache → замер → output diff и красную ветку другого fingerprint. Причина: рисунок объясняет условие сравнимости.
|
||||
- **Mechanism.** До: матрица содержала synthetic shape и статусы отсутствующих данных. После: строки описывают input, config, cache, runner и output; нижняя ветка останавливает несопоставимый замер. Причина: визуал служит cache/benchmark механизму.
|
||||
- **Field.** До: схема показывала hand-off. После: она сравнивает два metafile, считает delta, ведёт к chunk/map/network и возвращает при несовпадении input. Причина: диаграмма соответствует `summarizeBundleDiff()`.
|
||||
|
||||
- `configuration-hand-off-v1` требует `planDate: 2027-04`, `sourceCutoff: 2026-07-31`, две named synthetic configurations, named `comparableCondition` со state `not-collected`, а также `config`, `ci`, `buildTiming`, `cacheHit` и `bundleSize` строго `not-collected`.
|
||||
- `undated-future-scenario-v1` возвращает `stop-undated-future-scenario-or-cutoff`.
|
||||
- `missing-comparable-condition-v1` возвращает `stop-missing-comparable-condition`.
|
||||
- `hidden-configuration-or-cache-assumption-v1` возвращает `stop-hidden-configuration-or-cache-assumption`; скрытая configuration и assumed cache не получают default.
|
||||
- `disallowed-positive-result-v1` возвращает `stop-disallowed-positive-result`; нельзя заявить build improvement, migration или иной future outcome.
|
||||
- Factory делает JSON clone fixed literal и recursive deep freeze, включая `historicalArtifacts`. Evaluator принимает только JSON-равный известный literal; unknown или mutation fail-closed. Модуль не читает файлы или конфигурацию, не запускает build/CI/cache и не обращается к environment, clock, network, secrets, telemetry или production.
|
||||
SVG получили русские title/desc, доступные alt/caption и компактные подписи. Sharp 375 px проверил таблицу, стрелки, красные ветки и отсутствие обрезки. Опасные SVG-элементы и внешние ресурсы отсутствуют.
|
||||
|
||||
## Review pass 3 — accessibility, visual inspection и uniqueness
|
||||
## Проверки
|
||||
|
||||
- Все три SVG имеют русские `title` и `desc`, а статьи — осмысленные русские alt/caption. В SVG нет URL, измеренных значений или claims о build result.
|
||||
- XML/safety проверка исключает `script`, `foreignObject`, `javascript:`, `data:image` и inline handlers.
|
||||
- Sharp 375 px visual inspection проведена по PNG. Timeline: читаются четыре верхних шага, обе stop-ветви и подпись. Matrix: сохраняются пять строк, четыре колонки и нижний красный guard. Loop: различимы вход, дата, сравнимость, hand-off и центральный stop; текст не обрезан.
|
||||
- Strict pairwise uniqueness включает code и исключает section `Проверяемые источники`. Для каждой пары `shared-12-word-fragments=0`.
|
||||
|
||||
## Actual checks and results
|
||||
|
||||
Выполнено из `web/`:
|
||||
|
||||
```sh
|
||||
node --check scripts/upgrade-2027-04.mjs
|
||||
node scripts/upgrade-2027-04.mjs --verify-fixture
|
||||
npm run audit:draft -- scripts/upgrade-2027-04.mjs
|
||||
node --input-type=module -e "import { createFixedBuildCase, assessFixedBuildPlan } from './scripts/upgrade-2027-04.mjs'; const ids=['configuration-hand-off-v1','undated-future-scenario-v1','missing-comparable-condition-v1','hidden-configuration-or-cache-assumption-v1','disallowed-positive-result-v1']; for (const id of ids) console.log(id, assessFixedBuildPlan(createFixedBuildCase(id)).status); const accepted=assessFixedBuildPlan(createFixedBuildCase()); console.log('exports-frozen', Object.isFrozen(createFixedBuildCase()), Object.isFrozen(createFixedBuildCase().historicalArtifacts), accepted.productionEffect);"
|
||||
xmllint --noout public/assets/editorial/2027/build-evolution-2027-configuration-timeline.svg public/assets/editorial/2027/build-evolution-2027-comparable-conditions-matrix.svg public/assets/editorial/2027/build-evolution-2027-evidence-handoff-loop.svg
|
||||
! rg -n -i '<(script|foreignObject)\\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=' public/assets/editorial/2027/build-evolution-2027-configuration-timeline.svg public/assets/editorial/2027/build-evolution-2027-comparable-conditions-matrix.svg public/assets/editorial/2027/build-evolution-2027-evidence-handoff-loop.svg
|
||||
node --input-type=module -e "import sharp from 'sharp'; for (const n of ['build-evolution-2027-configuration-timeline','build-evolution-2027-comparable-conditions-matrix','build-evolution-2027-evidence-handoff-loop']) await sharp('public/assets/editorial/2027/'+n+'.svg').resize({width:375}).png().toFile('/private/tmp/'+n+'-375.png');"
|
||||
node --input-type=module -e "import { revisions } from './scripts/upgrade-2027-04.mjs'; const text=h=>h.replace(/<h2>Проверяемые источники<\\/h2>[\\s\\S]*/, '').replace(/<[^>]+>/g,' ').replace(/&(?:quot|amp|lt|gt|#039);/g,' ').toLowerCase().replace(/[^a-zа-яё0-9]+/giu,' ').trim().split(/\\s+/); const grams=a=>new Set(a.slice(0,-11).map((_,i)=>a.slice(i,i+12).join(' '))); let failed=false; for(let i=0;i<revisions.length;i++) for(let j=i+1;j<revisions.length;j++){const left=text(revisions[i].contentHtml), right=text(revisions[j].contentHtml), common=[...grams(left)].filter(x=>grams(right).has(x)); console.log(revisions[i].slug+' <> '+revisions[j].slug, 'shared-12-word-fragments='+common.length); if(common.length){failed=true;console.log(common.join('\\n'));}} if(failed) process.exitCode=1;"
|
||||
```text
|
||||
node --check scripts/upgrade-2027-04.mjs — PASS
|
||||
node scripts/upgrade-2027-04.mjs --verify-fixture — PASS, 4/4
|
||||
npm run audit:draft -- scripts/upgrade-2027-04.mjs — PASS, 3/3
|
||||
локальные build/cache/bundle examples — PASS, 12/12 для всей партии
|
||||
xmllint --noout для 3 SVG — PASS
|
||||
SVG safety scan — PASS
|
||||
Sharp resize width=375 для 3 SVG — PASS; визуально проверены timeline, matrix и bundle loop
|
||||
strict cross-article scan января–апреля: 12 статей, 66 сравнений, sources excluded, code included — collisions: []
|
||||
```
|
||||
|
||||
Результаты фактического запуска:
|
||||
|
||||
- Syntax: PASS, exit 0.
|
||||
- Fixture и article guards: PASS `8/8`; fixture `5/5`, все три article checks `true`.
|
||||
- Exact body chars, без section sources: `editorial-2027-04-practice-build-evolution` — `10846`; `editorial-2027-04-mechanism-build-evolution` — `11098`; `editorial-2027-04-field-build-evolution` — `9766`. Каждый текст находится в общем диапазоне 5k–15k и целевом 9k–13k.
|
||||
- Draft audit: PASS для трёх exact slugs.
|
||||
- Literal public exports: PASS. Статусы cases: `synthetic-plan-hand-off`, `stop-undated-future-scenario-or-cutoff`, `stop-missing-comparable-condition`, `stop-hidden-configuration-or-cache-assumption`, `stop-disallowed-positive-result`; `exports-frozen true true not-attempted`.
|
||||
- `xmllint`: PASS без output. SVG safety scan: PASS, `rg` не нашёл запрещённый content.
|
||||
- Sharp rendering и 375 px manual inspection: PASS для всех трёх SVG.
|
||||
- Strict pairwise duplicate scan (code included, sources excluded): PASS. `practice <> mechanism = 0`, `practice <> field = 0`, `mechanism <> field = 0` shared 12-word fragments.
|
||||
|
||||
Единственный не-failing output — существующие npm warnings о неизвестных user config `store-dir`, `cache-dir`, `public-hoist-pattern`; audit прошёл, warnings не относятся к P110.
|
||||
|
||||
## Независимая приёмка — 2026-07-31
|
||||
|
||||
### Проход 1 — источники, постановка и голос
|
||||
|
||||
- Mutable guide links заменены на проверяемые immutable snapshots: `webpack.js.org` commit `b7fa07c852d24449e9445717c41395bdd2ca4784` и `actions/cache` v4.2.3 commit `5a3ec84eff668545956fd18022155c47e93e2684`. Оба первичных источника доступны по закреплённым путям; SLSA остаётся версионной спецификацией v1.0.
|
||||
- Проверена фактическая граница claim: источники задают терминологию content hash, cache key/restore/save и provenance, но ни один не превращён в доказательство local config, CI run, cache hit, bundle size или migration.
|
||||
- У всех трёх статей собственная цена ошибки и самостоятельный вопрос: сравнимость config, уровни evidence и честная передача будущему владельцу. Автор говорит о стоимости решения и воспроизводимом методе, не рекламируя bundler.
|
||||
|
||||
### Проход 2 — исполнимый контракт и автоматический аудит
|
||||
|
||||
- `node --check`, fixture `8/8`, literal export/deep-freeze check и `npm run audit:draft -- scripts/upgrade-2027-04.mjs` завершились успешно. Длины body: 10 890, 11 098 и 9 766 знаков.
|
||||
- Пять fixed cases дают ровно один `synthetic-plan-hand-off` и четыре fail-closed stop-ветви; positive result и скрытая config/cache assumption не проходят. Accepted branch сохраняет `productionEffect: not-attempted`.
|
||||
- `xmllint` прошёл без output; SVG safety scan не нашёл executable или external active content.
|
||||
|
||||
### Проход 3 — визуал, повторяемость и выпуск
|
||||
|
||||
- Три SVG отрендерены и просмотрены в ширине 375 px: timeline, матрица и loop сохраняют заголовки, ячейки, стрелки и stop-блоки без обрезки.
|
||||
- Cross-package scan P102–P110 включает код и исключает источники. Первый запуск выявил шесть общих 12-словных фрагментов у practice runnable example с P108/P109; example переписан как отдельная boolean-проверка question contract. Повторный запуск по 27 статьям: `collisions: []`.
|
||||
- В реестр добавлены только три апрельские revisions; пользовательские app/data files не включены.
|
||||
Git, registry, README, `articles.json`, приложение и файлы других месяцев не изменялись.
|
||||
|
||||
@@ -1,97 +1,52 @@
|
||||
# P111 — May 2027: «Полевой справочник HTTP и TLS»
|
||||
# Май 2027 — техническая вычитка HTTP/TLS
|
||||
|
||||
## Статус и временная граница
|
||||
Пакет состоит из трёх самостоятельных статей. Общая тема — диагностика сетевой ошибки по уровню, но вопросы, примеры, таблицы и схемы у материалов разные.
|
||||
|
||||
Редакторская дата: **31 июля 2026**. Май 2027 ещё не наступил. Три материала — строго **plan/scenario на 2027-05** с source cutoff **2026-07-31**. Они не описывают controlled handshake, HTTP trace, cURL/OpenSSL run, endpoint, client configuration, certificate, error или production result. Названия cURL/OpenSSL присутствуют только как будущие средства со state limit `command: not-run`; endpoint, client configuration и trace остаются `not-collected`.
|
||||
| Статья | Body без источников | Практический результат |
|
||||
| --- | ---: | --- |
|
||||
| <code>editorial-2027-05-practice-http-tls-guide</code> | 5 768 | локальный HTTP-сервер, разделение 404/503/TLS |
|
||||
| <code>editorial-2027-05-mechanism-http-tls-guide</code> | 6 261 | обмен заголовками и границы DNS/TCP/TLS/HTTP |
|
||||
| <code>editorial-2027-05-field-http-tls-guide</code> | 6 012 | очищенная карточка сетевой ошибки и sanitizer |
|
||||
|
||||
Модуль принимает только named fixed synthetic cases и fixed in-memory literals. Factory выполняет JSON clone и recursive deep freeze; evaluator fail-closed сравнивает input с known literal. Положительный output ровно один: `synthetic-plan-hand-off` с `productionEffect: not-attempted`. Код не читает сеть, socket, browser, files, environment, clock, secrets, telemetry, external tools или production и не пытается получить HTTP/TLS-результат.
|
||||
## Проход 1 — факты, пример и источники
|
||||
|
||||
## Источники и boundary
|
||||
| Статья | До | После | Причина |
|
||||
| --- | --- | --- | --- |
|
||||
| Practice | Ошибка сертификата и HTTP-статус описывались рядом как одна проблема. | Добавлено правило: после успешной проверки TLS и получения <code>404</code> проверяем HTTP-маршрут; при исключении TLS статус приложения не ищем. | Разделить этапы запроса и не назначать HTTP-код до завершения TLS. |
|
||||
| Mechanism | <code>Host</code> и пользовательский request id могли выглядеть доказательством источника ответа. | Добавлена оговорка про <code>:authority</code> в HTTP/2/3 и доверенную границу генерации request id. | Заголовок сообщения не подтверждает origin сам по себе. |
|
||||
| Field | Очистка была описана вокруг <code>Authorization</code> и Cookie. | Добавлена проверка proxy-аутентификации и значений после redirect; sanitizer сохраняет имя поля и маскирует значение целиком. | Снизить риск утечки секрета при передаче verbose-вывода. |
|
||||
|
||||
1. [RFC 9110 — HTTP Semantics](https://www.rfc-editor.org/rfc/rfc9110), June 2022, DOI `10.17487/RFC9110`. Первичный pinned источник HTTP semantics. Он не подтверждает конкретное сообщение, header, endpoint, response или server state.
|
||||
2. [RFC 9112 — HTTP/1.1](https://www.rfc-editor.org/rfc/rfc9112), June 2022, DOI `10.17487/RFC9112`. Первичный pinned источник HTTP/1.1 framing. Он не доказывает bytes, ошибку или transport поведение неизвестного соединения.
|
||||
3. [RFC 9114 — HTTP/3](https://www.rfc-editor.org/rfc/rfc9114), June 2022, DOI `10.17487/RFC9114`. Первичный pinned источник HTTP/3/QUIC mapping. Он не утверждает доступность HTTP/3 в конкретном клиенте или service.
|
||||
4. [RFC 8446 — TLS 1.3](https://www.rfc-editor.org/rfc/rfc8446), August 2018, DOI `10.17487/RFC8446`. Первичный pinned источник TLS 1.3 handshake vocabulary. Он не заменяет certificate chain, policy, negotiated parameters или trace.
|
||||
Проверены первичные источники:
|
||||
|
||||
Все источники датированы не позже cutoff. В P111 не заявляется current cURL/OpenSSL behavior: exact pinned release source для такой версии/build/option semantics не верифицирован, а command output не изобретался.
|
||||
1. [RFC 9110 — HTTP Semantics](https://www.rfc-editor.org/rfc/rfc9110.html), IETF Standards Track, June 2022. Использован для методов, статусов, маршрутизации и заголовков. Граница: документ не объясняет конфигурацию конкретного proxy или сервиса.
|
||||
2. [RFC 8446 — TLS 1.3](https://www.rfc-editor.org/rfc/rfc8446.html), IETF Standards Track, August 2018. Использован для рукопожатия и проверки имени. Граница: RFC не подтверждает доверие к локальному хранилищу сертификатов.
|
||||
|
||||
## Review pass 1 — фокус, проблема и форма
|
||||
Обе ссылки отвечают HTTP 200 при прямом запросе. Все утверждения о конкретном выводе отделены от словаря RFC; локальный сервер маркирован как учебный.
|
||||
|
||||
- **Practice** начинает с стоимости смешения HTTP semantics, framing, TLS и policy, затем строит versioned question map. Он не использует default «HTTPS» и передаёт только named protocol/version question.
|
||||
- **Mechanism** начинает с цены неверного inference между уровнями. Угол — границы между semantic, framing, TLS negotiation и client-policy error classes без диагностики существующего error.
|
||||
- **Field** начинает с стоимости выданного за отчёт вопроса. Угол — synthetic evidence hand-off с provenance и state limits, а не сетевой report.
|
||||
- Во всех первых двух абзацах есть concrete issue/cost, дата, cutoff, запрет на реальные network facts и единственный allowed positive outcome. Тон M10: короткая прикладная русская техническая проза без generic protocol tips.
|
||||
- В каждом revision есть механизм, accessible HTML table, own SVG с русскими alt/caption, safe runnable literal, ordered action sequence, limits и next step. Финальные body lengths: practice — `10 000`, mechanism — `10 216`, field — `10 058` знаков.
|
||||
## Проход 2 — структура, голос и плотность
|
||||
|
||||
## Review pass 2 — literal safety и доказательная граница
|
||||
| Статья | До | После | Причина |
|
||||
| --- | --- | --- | --- |
|
||||
| Practice | Вводная часть начинала с общего «SSL не работает». | В первых абзацах названы 404, 503, ошибка имени сертификата и стоимость неверного уровня; затем сразу дана таблица «наблюдение → действие». | Вернуть текст к формуле «симптом → причина → проверка». |
|
||||
| Mechanism | Объяснение границ и заголовков шло одним длинным блоком. | Материал разделён на пять границ, локальный обмен и отдельную таблицу безопасных полей. | Один раздел отвечает на один вопрос и читается с телефона. |
|
||||
| Field | Передача вывода описывалась как совет «удалить секреты». | Появились карточка с фактами/гипотезой, ожидаемый вывод sanitizer и шесть последовательных шагов. | Сделать следующий запрос воспроизводимым. |
|
||||
|
||||
- `undated-plan-or-cutoff-v1` получает `stop-undated-plan-or-cutoff`; редакционная дата и cutoff не подставляются по умолчанию.
|
||||
- `unnamed-protocol-or-version-question-v1` получает `stop-unnamed-protocol-or-version-question`; protocol/version question не угадывается.
|
||||
- `evidence-stronger-than-input-v1` получает `stop-evidence-stronger-than-input`; `claimed` result, header finding, certificate conclusion или иной stronger output не допускается из `not-collected/input-bounded` input.
|
||||
- `hidden-command-endpoint-or-config-v1` получает `stop-hidden-command-endpoint-or-config`; команда, endpoint, client configuration и trace могут быть только `not-run/not-collected`.
|
||||
- `disallowed-positive-network-conclusion-v1` получает `stop-disallowed-positive-network-conclusion`; handshake success, response success, remediation и production result запрещены.
|
||||
- JSON clone + recursive deep freeze закрепляют nested `protocolQuestion` и `evidence`; unknown object получает `stop-unknown-fixed-input`. Runnable examples не импортируют network libraries и не вызывают cURL/OpenSSL.
|
||||
Голос — спокойный технический разбор с конкретными глаголами: «получен», «сверить», «сопоставить», «повторить». Внутренние планы, развитие автора и редакционные статусы в HTML отсутствуют.
|
||||
|
||||
## Review pass 3 — SVG, мобильный осмотр и фактические проверки
|
||||
## Проход 3 — визуал, доступность и повторы
|
||||
|
||||
- Все SVG имеют русские `title` и `desc`, article alt/caption, data-bearing content. В них нет внешних ссылок, `script`, `foreignObject`, `javascript:`, `data:image` или event handlers.
|
||||
- Sharp-рендеры в ширине 375px осмотрены вручную: handshake/header map сохраняет четыре границы и зелёный hand-off; matrix сохраняет четыре колонки и красные inference limits; evidence loop сохраняет три gates, stop и hand-off. Обрезания не обнаружены.
|
||||
- Строгая попарная проверка исключает source section, но извлекает и `<p>`, и `<pre>` — runnable code участвует в scan. Результат для всех пар: `exactParagraphs160: 0`, `common12WordFragments: 0`.
|
||||
| Статья | До | После | Причина |
|
||||
| --- | --- | --- | --- |
|
||||
| Practice | Старая схема показывала внутреннюю проверку материала. | SVG заменён на цепочку DNS/TCP → TLS → HTTP → handler с русскими <code>title</code>/<code>desc</code>; <code>alt</code> и подпись называют границу остановки. | Рисунок теперь объясняет предмет статьи. |
|
||||
| Mechanism | Таблица симптомов была нечитаема без контекста. | SVG стал матрицей «симптом → граница → первое действие», HTML-таблица получила явный caption и <code>scope</code>. | Сохранить смысл при ширине 375 px. |
|
||||
| Field | Схема hand-off говорила о передаче статуса. | SVG показывает сбор, очистку, сверку и повтор; caption отдельно предупреждает о факте и гипотезе. | Убрать мета-лексическую интерпретацию из визуала. |
|
||||
|
||||
Фактически выполненные команды из `web/`:
|
||||
<code>xmllint --noout</code> и SVG safety scan прошли для трёх файлов. Sharp отрендерил <code>375×240</code>, <code>375×250</code>, <code>375×250</code>; ручной просмотр не выявил обрезания, наложений или нечитабельной подписи. Визуалы не содержат script, <code>foreignObject</code>, <code>javascript:</code>, <code>data:image</code> или event handler.
|
||||
|
||||
```sh
|
||||
node --check scripts/upgrade-2027-05.mjs
|
||||
node scripts/upgrade-2027-05.mjs --verify-fixture
|
||||
npm run audit:draft -- scripts/upgrade-2027-05.mjs
|
||||
node --input-type=module -e "import { createFixedHttpTlsCase, assessFixedHttpTlsPlan } from './scripts/upgrade-2027-05.mjs'; for (const id of ['planned-http-tls-question-v1','undated-plan-or-cutoff-v1','unnamed-protocol-or-version-question-v1','evidence-stronger-than-input-v1','hidden-command-endpoint-or-config-v1','disallowed-positive-network-conclusion-v1']) console.log(id, assessFixedHttpTlsPlan(createFixedHttpTlsCase(id)).status);"
|
||||
xmllint --noout public/assets/editorial/2027/http-tls-guide-2027-handshake-header-map.svg public/assets/editorial/2027/http-tls-guide-2027-symptom-boundary-matrix.svg public/assets/editorial/2027/http-tls-guide-2027-evidence-handoff-loop.svg
|
||||
rg -n -i "<(script|foreignObject)\\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=" public/assets/editorial/2027/http-tls-guide-2027-handshake-header-map.svg public/assets/editorial/2027/http-tls-guide-2027-symptom-boundary-matrix.svg public/assets/editorial/2027/http-tls-guide-2027-evidence-handoff-loop.svg
|
||||
node --input-type=module -e "import sharp from 'sharp'; for (const n of ['http-tls-guide-2027-handshake-header-map','http-tls-guide-2027-symptom-boundary-matrix','http-tls-guide-2027-evidence-handoff-loop']) { const out='/private/tmp/'+n+'-375.png'; const info=await sharp('public/assets/editorial/2027/'+n+'.svg').resize({width:375}).png().toFile(out); console.log(out, info.width+'x'+info.height); }"
|
||||
```
|
||||
## Итоговые проверки
|
||||
|
||||
Строгий pairwise scan (sources исключены, code включён) выполнен этим кодом:
|
||||
|
||||
```js
|
||||
const source = /<h2>Проверяемые источники[\s\S]*$|<h2>Проверяемые источники<\/h2>[\s\S]*$/;
|
||||
const clean = (html) => html.replace(source, '');
|
||||
const plain = (html) => clean(html).replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
|
||||
const paragraphs = (html) => clean(html).match(/<(?:p|pre)\b[^>]*>[\s\S]*?<\/(?:p|pre)>/g)?.map(plain).filter((x) => x.length >= 160) ?? [];
|
||||
const grams = (text) => { const words = text.toLowerCase().replace(/[^a-zа-яё0-9]+/giu, ' ').trim().split(/\s+/); const out = new Set(); for (let i = 0; i <= words.length - 12; i++) out.add(words.slice(i, i + 12).join(' ')); return out; };
|
||||
// Для каждой пары: exactParagraphs160 = пересечение paragraphs;
|
||||
// common12WordFragments = пересечение grams(plain(contentHtml)).
|
||||
```
|
||||
|
||||
Фактические результаты: syntax — pass; fixture — `9/9` (`6/6` literals + `3/3` article checks); audit — pass для трёх exact slug с lengths `10 000 / 10 216 / 10 058`; public exports дали один `synthetic-plan-hand-off` и пять ожидаемых stop-status; `xmllint` — pass; SVG safety scan — empty/pass; Sharp — три файла `375x225`; visual inspection — pass; strict pairwise duplicate scan — нули по обеим метрикам во всех трёх парах.
|
||||
|
||||
## Disposition
|
||||
|
||||
Изменены только пять файлов P111:
|
||||
|
||||
- `web/scripts/upgrade-2027-05.mjs`
|
||||
- `editorial/reviews/2027-05-draft.md`
|
||||
- `web/public/assets/editorial/2027/http-tls-guide-2027-handshake-header-map.svg`
|
||||
- `web/public/assets/editorial/2027/http-tls-guide-2027-symptom-boundary-matrix.svg`
|
||||
- `web/public/assets/editorial/2027/http-tls-guide-2027-evidence-handoff-loop.svg`
|
||||
|
||||
Registry, README, `articles.json`, app, queue, P102–P110 и Git-state не менялись. P111 заканчивается только synthetic plan hand-off; `productionEffect: not-attempted` не является наблюдением о сети или production.
|
||||
|
||||
## Независимая приёмка — 2026-07-31
|
||||
|
||||
### Проход 1 — источники, фактическая граница и голос
|
||||
|
||||
- RFC 9110, 9112, 9114 и 8446 проверены как первичные датированные спецификации. Они поддерживают только vocabulary для HTTP semantics/framing, HTTP/3 и TLS 1.3; текст не делает из них вывод о конкретном handshake, certificate, response, endpoint или client behavior.
|
||||
- Три статьи не превращаются в общий справочник: practice строит карту вопроса, mechanism запрещает межуровневый inference, field описывает provenance hand-off. У каждого текста собственная цена ошибки, таблица, пример и следующий шаг.
|
||||
- Указаны planDate 2027-05 и cutoff 2026-07-31; слова о cURL/OpenSSL удержаны на уровне будущего `not-run`, без неподтверждённого version/option claim.
|
||||
|
||||
### Проход 2 — исполнимый контракт и автоматический аудит
|
||||
|
||||
- `node --check`, fixture `9/9`, public literal check и `npm run audit:draft -- scripts/upgrade-2027-05.mjs` прошли. Длины body: 10 000, 10 216 и 10 058 знаков.
|
||||
- Единственная accepted ветвь — `synthetic-plan-hand-off`; пять контрпримеров останавливаются fail-closed. Deep freeze охватывает nested protocol question и evidence, а accepted output оставляет `productionEffect: not-attempted`.
|
||||
- `xmllint` проходит без output; safety scan не обнаружил active content в трёх SVG.
|
||||
|
||||
### Проход 3 — визуал, уникальность и выпуск
|
||||
|
||||
- SVG отрендерены и просмотрены в ширине 375 px: карта удерживает четыре диагностические границы, matrix — все колонки и пределы inference, loop — три gate, stop и hand-off.
|
||||
- Строгий cross-package scan P102–P111 исключает sources, но включает code. Для 30 статей результат `collisions: []`.
|
||||
- В реестр добавлены ровно три майские revisions; пользовательские app/data files не включены.
|
||||
- <code>node --check scripts/upgrade-2027-05.mjs</code> — PASS.
|
||||
- <code>node scripts/upgrade-2027-05.mjs --verify-fixture</code> — PASS, <code>7/7</code>.
|
||||
- <code>npm run audit:draft -- scripts/upgrade-2027-05.mjs</code> — PASS, 3/3 exact slugs.
|
||||
- Три извлечённых <code><pre><code></code> запущены через Node на loopback/локальных данных — <code>3/3</code>.
|
||||
- В сквозном сравнении 349 материалов, 4 176 сравнений, sources исключены, code включён; совпадений 12-словных фрагментов — <code>0</code>.
|
||||
|
||||
@@ -1,103 +1,53 @@
|
||||
# P112 — June 2027: «Большой разбор производительности»
|
||||
# Июнь 2027 — техническая вычитка производительности
|
||||
|
||||
## Статус, temporal boundary и file scope
|
||||
Тройка отвечает на разные вопросы: где начинается критический путь, какой ресурс действительно блокирует страницу и как повторить замер.
|
||||
|
||||
Редакторская дата: **2026-07-31**. Июнь 2027 ещё не наступил. Три revision — только **plan/scenario на 2027-06** с source cutoff **2026-07-31**. В них не существуют и не заявляются benchmark, telemetry, profile, bottleneck, rollout, winner, product/production effect, service data или raw telemetry.
|
||||
| Статья | Body без источников | Практический результат |
|
||||
| --- | ---: | --- |
|
||||
| <code>editorial-2027-06-practice-performance-capstone</code> | 5 632 | локальный сервер fast/slow и разделение TTFB/HTML |
|
||||
| <code>editorial-2027-06-mechanism-performance-capstone</code> | 5 275 | чтение Resource Timing по инициатору и потребителю |
|
||||
| <code>editorial-2027-06-field-performance-capstone</code> | 5 452 | локальная серия из 20 замеров, median и p95 |
|
||||
|
||||
Модуль принимает лишь named fixed in-memory literals. Единственный положительный status — `synthetic-plan-hand-off`, всегда с `productionEffect: not-attempted`; прочие cases проходят fail-closed. Код не читает files, network, environment, clock, secrets, telemetry, browsers, services, systems или data и не делает наблюдений. Реальный сбор, profile, service inspection или интерпретация могут появиться только в отдельном явно authorised scope.
|
||||
## Проход 1 — факты, пример и источники
|
||||
|
||||
Изменены только разрешённые P112-файлы:
|
||||
| Статья | До | После | Причина |
|
||||
| --- | --- | --- | --- |
|
||||
| Practice | Общая задержка страницы могла смешивать TTFB и визуальную готовность. | Добавлено различие TTFB, DOMContentLoaded, FCP и LCP; локальный сервер измеряет только HTTP-участок. | Не выдавать серверный замер за пользовательскую метрику. |
|
||||
| Mechanism | Длинная полоса waterfall трактовалась как причина. | Добавлены <code>initiatorType</code>, потребитель ресурса и правило для отсутствующего <code>renderBlockingStatus</code>. | Время ресурса не доказывает, что экран его ждал. |
|
||||
| Field | Среднее и p95 описывались без разделения режимов кэша. | Добавлена проверка cold/warm cache и сохранение сырых значений вместе с размером выборки. | Сделать сравнение условий воспроизводимым. |
|
||||
|
||||
- `web/scripts/upgrade-2027-06.mjs`
|
||||
- `editorial/reviews/2027-06-draft.md`
|
||||
- `web/public/assets/editorial/2027/performance-capstone-2027-critical-path-contract.svg`
|
||||
- `web/public/assets/editorial/2027/performance-capstone-2027-evidence-boundary-matrix.svg`
|
||||
- `web/public/assets/editorial/2027/performance-capstone-2027-handoff-loop.svg`
|
||||
Проверены первичные источники:
|
||||
|
||||
Git не использовался. Registry, README, queue, `articles.json`, app и P102–P111 не менялись.
|
||||
1. [W3C Navigation Timing Level 2](https://www.w3.org/TR/2026/WD-navigation-timing-2-20260225/), Working Draft, 25 February 2026. Использован для временных меток навигации. Граница: draft не задаёт пороги качества и не сообщает значения конкретного браузера.
|
||||
2. [W3C Performance Timeline](https://www.w3.org/TR/2025/CRD-performance-timeline-20250521/), Candidate Recommendation Draft, 21 May 2025. Использован для <code>PerformanceEntry</code> и <code>PerformanceObserver</code>. Граница: документ не гарантирует одинаковую поддержку entry во всех движках.
|
||||
3. [W3C Resource Timing](https://www.w3.org/TR/2026/CRD-resource-timing-20260420/), Candidate Recommendation Draft, 20 April 2026. Использован для времени и размеров ресурсов. Граница: кросс-доменные поля зависят от политики браузера и заголовков.
|
||||
|
||||
## Закреплённые первичные источники и URL verification
|
||||
Все три датированные страницы отвечают HTTP 200. Черновой статус W3C назван в источнике и не превращён в факт о приложении.
|
||||
|
||||
1. [W3C Performance Timeline Level 2](https://www.w3.org/TR/2019/WD-performance-timeline-2-20190329/) — W3C Working Draft, **dated snapshot 2019-03-29**. Это immutable датированная замена прежнему mutable URL. Используется для vocabulary `PerformanceEntry`/`PerformanceObserver`; не подтверждает существование entry, rendering path или effect в неизвестном приложении.
|
||||
2. [W3C Navigation Timing Level 2](https://www.w3.org/TR/2026/WD-navigation-timing-2-20260225/) — W3C Working Draft, **2026-02-25**. Используется для границ navigation timing entry; не создаёт future measurement или baseline.
|
||||
3. [W3C Resource Timing](https://www.w3.org/TR/2026/CRD-resource-timing-20260420/) — W3C Candidate Recommendation Draft, **2026-04-20**. Используется для vocabulary resource entries и `Timing-Allow-Origin`; не делает условия сопоставимыми и не устанавливает bottleneck.
|
||||
4. [W3C Long Tasks API](https://www.w3.org/TR/2026/WD-longtasks-1-20260319/) — W3C Working Draft, **2026-03-19**. Используется для определения класса long task; не доказывает profile, причину задержки или наличие long task в продукте.
|
||||
## Проход 2 — структура, голос и плотность
|
||||
|
||||
Все четыре exact W3C URL проверены 2026-07-31 запросом `curl -I -L`: HTTP **200**. Их датированные publication/last-modified значения — 2019-03-29, 2026-02-25, 2026-04-20 и 2026-03-19; каждое не позже source cutoff. Предыдущая mutable-публикация удалена из script и review: историческим доказательством остаётся только закреплённый W3C snapshot. Спецификация задаёт термин и visibility boundary, но никогда не выступает evidence измеренного результата.
|
||||
| Статья | До | После | Причина |
|
||||
| --- | --- | --- | --- |
|
||||
| Practice | Текст мог читаться как список метрик. | В начале оставлен один вопрос — «какой участок задерживает экран» — и для каждого действия добавлена цена. | Сохранить техлидский компромисс вместо каталога терминов. |
|
||||
| Mechanism | Waterfall, CSS и script были смешаны в одном объяснении. | Добавлены отдельные блоки про initiator, порядок <code>defer/async</code>, размер и зависимость. | Читатель видит механизм до рецепта. |
|
||||
| Field | p95 появлялся раньше описания условий. | Протокол перенесён перед кодом: URL, commit, browser, cache, повторы, метрика. | Число получает вход и единицу измерения. |
|
||||
|
||||
## Additional independent correction after rejection
|
||||
Прагматичная речь проверена по формуле «симптом → измерение → изменение → ограничение». Общие оценки удалены; в тексте остались измеряемые участки, условия и ожидаемый результат.
|
||||
|
||||
Независимая приёмка справедливо отклонила предыдущую глубину **5 913 / 6 306 / 6 203** знака: общий минимум выполнялся, но это не соответствовало очереди «Большой разбор производительности». Исправление расширило статьи до строгого локального диапазона **9 000–12 000** знаков и закрепило тот же диапазон в `revision()` и `verifyRevisionsAgainstFixture()`.
|
||||
## Проход 3 — визуал, доступность и повторы
|
||||
|
||||
- **Practice** теперь отдельно разбирает navigation/resource/main-thread/action boundary, единицу работы, owner каждого элемента контракта, ложный proxy-контрпример и редакционный stop для склеенной постановки.
|
||||
- **Mechanism** добавляет condition ledger, смысл baseline без прошлого числа, confounders, TAO/visibility/privacy boundary, различие между числом и causal claim, а также будущие outcomes фальсификации без выдачи их за result.
|
||||
- **Field** добавляет evidence record против отчёта, разделение прав на сбор и решение, no-data hand-off, независимость review от decision и минимальный контракт следующего scope.
|
||||
| Статья | До | После | Причина |
|
||||
| --- | --- | --- | --- |
|
||||
| Practice | Схема не отделяла сервер от блокирующих ресурсов. | SVG стал временной линией TTFB → HTML → CSS/JS → Paint; alt повторяет эту границу. | Рисунок поддерживает ключевое различие статьи. |
|
||||
| Mechanism | Визуал не показывал потребителя ресурса. | SVG-матрица получила колонки «ресурс, инициатор, время, ждёт, действие». | Сократить визуальное чтение waterfall до проверяемых полей. |
|
||||
| Field | Цикл замера не показывал p95 и изменение одного фактора. | SVG показывает условия, повторы, p95 и возврат к одному фактору; подпись предупреждает о raw distribution. | Не сводить измерение к одной цифре. |
|
||||
|
||||
Новые body lengths без sources: practice — **11 758**, mechanism — **11 981**, field — **11 747** знаков. Все новые разделы описывают контракт будущей работы, а не будущий benchmark, telemetry, profile или производственный эффект.
|
||||
<code>xmllint --noout</code> и SVG safety scan прошли для трёх файлов. Sharp отрендерил <code>375×240</code>, <code>375×250</code>, <code>375×250</code>; подписи, таблицы и карточки читаются без горизонтального скролла. Все изображения имеют русские <code>title</code>, <code>desc</code>, HTML <code>alt</code> и <code>figcaption</code>.
|
||||
|
||||
## Review pass 1 — содержание, источники и temporal honesty
|
||||
## Итоговые проверки
|
||||
|
||||
- Первые два абзаца каждой статьи по-прежнему называют исходную проблему и цену: спорные правки, ложный winner и преждевременный rollout соответственно.
|
||||
- Три текста сохраняют разные главные вопросы: practice — что является единицей критического пути; mechanism — что сделает сравнение опровержимым; field — как передать вопрос без отчёта.
|
||||
- Ссылки отделены от фактов: датированные W3C snapshots объясняют API и ограничения, но не подтверждают route, service, response, entry, timing или пользовательское состояние.
|
||||
- В каждом revision есть HTML table, исходная русская SVG-схема с meaningful alt/caption, safe runnable example, ordered actions, limits и concrete next scope boundary.
|
||||
|
||||
## Review pass 2 — literal safety и fail-closed
|
||||
|
||||
- `critical-path-contract-2027-06-v1` — единственный accept: `synthetic-plan-hand-off` / `productionEffect: not-attempted`.
|
||||
- `missing-june-date-or-cutoff-v1` — `stop-missing-june-date-or-cutoff`; date и cutoff не выводятся по умолчанию.
|
||||
- `unnamed-path-contract-v1` — `stop-unnamed-path-contract`; question обязана иметь id и revision.
|
||||
- `conditions-claimed-without-record-v1` — `stop-conditions-claimed-without-record`; browser/device/cache/route нельзя assumed.
|
||||
- `observation-injected-into-plan-v1` — `stop-observation-injected-into-plan`; benchmark, telemetry и profile остаются unobserved.
|
||||
- `result-substitution-v1` — `stop-result-substitution`; winner, bottleneck, rollout и production conclusion запрещены.
|
||||
- JSON clone + recursive deep freeze закрывают mutation nested contract/conditions/evidence. Unknown input закрывается `stop-unknown-fixed-literal`. Runnable examples выполняют только fixed literal/evaluator и не имеют I/O.
|
||||
|
||||
## Review pass 3 — visual, mobile, SVG safety и uniqueness
|
||||
|
||||
- Все SVG имеют русский `title`/`desc`; article figures имеют русские alt/caption. Не найдены external URL, `script`, `foreignObject`, `javascript:`, `data:image` или inline event handlers.
|
||||
- Sharp создал три изображения **375×225**. Ручной осмотр: contract сохраняет четыре границы и итоговый hand-off; matrix — четыре строки/колонки и stop rule; loop — вход, проверки, stop-ветку и владельца. Обрезаний или перекрытий нет.
|
||||
- Strict scan исключал section `Проверяемые источники`, но включал `<p>` и `<pre>`, поэтому runnable code участвовал. Сканированы 3 P112 revision попарно и против **30** published revision P102–P111 (2026-08…2027-05). `exactParagraphs160: 0`, `common12WordFragments: 0`, `failures: []`.
|
||||
|
||||
## Реально выполненные проверки после correction
|
||||
|
||||
Из `web/` выполнены:
|
||||
|
||||
```sh
|
||||
node --check scripts/upgrade-2027-06.mjs
|
||||
node scripts/upgrade-2027-06.mjs --verify-fixture
|
||||
npm run audit:draft -- scripts/upgrade-2027-06.mjs
|
||||
xmllint --noout public/assets/editorial/2027/performance-capstone-2027-critical-path-contract.svg public/assets/editorial/2027/performance-capstone-2027-evidence-boundary-matrix.svg public/assets/editorial/2027/performance-capstone-2027-handoff-loop.svg
|
||||
rg -n -i '<(script|foreignObject)\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=' public/assets/editorial/2027/performance-capstone-2027-critical-path-contract.svg public/assets/editorial/2027/performance-capstone-2027-evidence-boundary-matrix.svg public/assets/editorial/2027/performance-capstone-2027-handoff-loop.svg
|
||||
node --input-type=module -e "import sharp from 'sharp'; /* render all three SVG at width 375 */"
|
||||
node --input-type=module -e "/* import P102-P111 and P112; exclude sources; scan p/pre and 12-word grams */"
|
||||
curl -I -L https://www.w3.org/TR/2019/WD-performance-timeline-2-20190329/
|
||||
curl -I -L https://www.w3.org/TR/2026/WD-navigation-timing-2-20260225/
|
||||
curl -I -L https://www.w3.org/TR/2026/CRD-resource-timing-20260420/
|
||||
curl -I -L https://www.w3.org/TR/2026/WD-longtasks-1-20260319/
|
||||
```
|
||||
|
||||
Фактические результаты: syntax — pass; fixture — **9/9** (6 literal statuses + 3 articles); internal 9–12k guard — pass; audit — pass для three exact slug с **11 758 / 11 981 / 11 747** body chars; XML — pass; SVG safety scan — empty/pass; Sharp — **3 × 375×225**; manual mobile review — pass; duplicate scan — `scannedP112: 3`, `againstP102toP111: 30`, `failures: []`; W3C URL verification — **4 × HTTP 200**.
|
||||
|
||||
## Disposition
|
||||
|
||||
P112 остаётся завершённым плановым выпуском: итогом может быть лишь `synthetic-plan-hand-off`. Любая будущая работа с реальными target, data, telemetry, profile, benchmark, interpretation, rollout или effect требует собственного authorised scope и не может быть задним числом добавлена в этот выпуск.
|
||||
|
||||
## Независимая приёмка — 2026-07-31
|
||||
|
||||
### Проход 1 — глубина, источники и границы знания
|
||||
|
||||
- Предыдущая краткая версия была отклонена и расширена до 11 758, 11 981 и 11 747 знаков. Новые разделы раскрывают ownership, false proxy, condition ledger, confounders, visibility/TAO, privacy, provenance и separation review/decision, не добавляя вымышленного performance-result.
|
||||
- Все источники W3C проверены: immutable snapshot Performance Timeline от 2019-03-29 и три датированных W3C публикации 2026 года существуют до cutoff 2026-07-31. Они применены как vocabulary и спецификация visibility, не как evidence о продукте.
|
||||
- Practice, mechanism и field сохраняют разные вопросы и цену: договор критического пути, опровержимость claim и передача вопроса без отчёта.
|
||||
|
||||
### Проход 2 — контракт и редакционный автоматический аудит
|
||||
|
||||
- `node --check`, fixture `9/9`, export/deep-freeze check и `npm run audit:draft -- scripts/upgrade-2027-06.mjs` прошли. Единственная accepted ветвь — `synthetic-plan-hand-off`; все пять контрпримеров останавливаются fail-closed, accepted effect — `not-attempted`.
|
||||
- Три body проходят не только глобальный диапазон 5–15k, но и локальную защиту capstone `9–12k`.
|
||||
- `xmllint` прошёл без output; SVG safety scan не нашёл executable или active external content.
|
||||
|
||||
### Проход 3 — визуал, overlap и выпуск
|
||||
|
||||
- Три SVG заново отрендерены и просмотрены на ширине 375 px: контур критического пути, матрица сравнимости и hand-off loop остаются читаемыми без обрезания.
|
||||
- Strict cross-package scan P102–P112 исключает source section, но включает code. Для 33 статей результат: `collisions: []`.
|
||||
- В реестр добавлены только три июньские revisions; пользовательские app/data files не включены.
|
||||
- <code>node --check scripts/upgrade-2027-06.mjs</code> — PASS.
|
||||
- <code>node scripts/upgrade-2027-06.mjs --verify-fixture</code> — PASS, <code>7/7</code>.
|
||||
- <code>npm run audit:draft -- scripts/upgrade-2027-06.mjs</code> — PASS, 3/3 exact slugs.
|
||||
- Три извлечённых примера запущены локально: серверный замер, browser timing snippet в Node-совместимой среде и p95 — <code>3/3</code>.
|
||||
- Сквозное сравнение 349 материалов, 4 176 сравнений, sources исключены, code включён; совпадений — <code>0</code>.
|
||||
|
||||
@@ -1,102 +1,52 @@
|
||||
# P113 — июль 2027: «Большой разбор надёжности»
|
||||
# Июль 2027 — техническая вычитка retry и идемпотентности
|
||||
|
||||
## Статус и граница пакета
|
||||
Три статьи разделяют решение о повторе, прикладную семантику операции и поля, которые позволяют расследовать исчерпанное время.
|
||||
|
||||
Редакторская дата: **2026-07-31**. Номер: **2027-07**. Source cutoff: **2026-07-31**. Это будущий editorial plan/scenario, не описание существующей эксплуатации.
|
||||
| Статья | Body без источников | Практический результат |
|
||||
| --- | ---: | --- |
|
||||
| <code>editorial-2027-07-practice-reliability-capstone</code> | 5 401 | локальный сервер 503 → 503 → 200 с общим deadline |
|
||||
| <code>editorial-2027-07-mechanism-reliability-capstone</code> | 5 710 | локальный POST с idempotency key и одним resource id |
|
||||
| <code>editorial-2027-07-field-reliability-capstone</code> | 5 677 | события попыток с remainingMs и decision |
|
||||
|
||||
В тексте и fixed literal не заявлены actual incident, runbook, failure-injection, SLO/SLI value, telemetry, deployment, recovery, rollout, owner, production outcome или winner. Не использованы fictional incident materials. Единственный accepted positive output evaluator — `synthetic-plan-hand-off` с `productionEffect: not-attempted`.
|
||||
## Проход 1 — факты, пример и источники
|
||||
|
||||
Разрешённый write scope соблюдён. Подготовлены только:
|
||||
| Статья | До | После | Причина |
|
||||
| --- | --- | --- | --- |
|
||||
| Practice | Заголовок обещал общий deadline, а код ограничивал только число попыток. | В код добавлены deadline, вычисление остатка времени и <code>AbortSignal.timeout</code>; проверка метода сохранена. | Пример должен демонстрировать заявленный контракт, а не только цикл. |
|
||||
| Mechanism | Локальный сервер мог создать впечатление полной дедупликации тела запроса. | В тексте прямо указано: учебный сервер читает только ключ; проверка тела, атомарность и срок хранения вынесены в ограничения. | Не выдавать Map за транзакционную реализацию. |
|
||||
| Field | Событие содержало attempt и status, но не остаток времени. | Добавлено поле <code>remainingMs</code>, а fixture сохраняет отдельное состояние deadline. | Отделить исчерпанное время от ответа 503. |
|
||||
|
||||
- `web/scripts/upgrade-2027-07.mjs`
|
||||
- `editorial/reviews/2027-07-draft.md`
|
||||
- `web/public/assets/editorial/2027/reliability-capstone-2027-fault-tree-contract.svg`
|
||||
- `web/public/assets/editorial/2027/reliability-capstone-2027-recovery-evidence-matrix.svg`
|
||||
- `web/public/assets/editorial/2027/reliability-capstone-2027-response-handoff-loop.svg`
|
||||
Проверены первичные источники:
|
||||
|
||||
Git не использовался. Registry, README, queue, `articles.json`, app и чужие пакеты не изменялись.
|
||||
1. [RFC 9110 — HTTP Semantics](https://www.rfc-editor.org/rfc/rfc9110.html), IETF Standards Track, June 2022. Использован для safe/idempotent methods, статусов и <code>Retry-After</code>. Граница: RFC не выбирает retry policy конкретного API.
|
||||
2. [RFC 9000 — QUIC](https://www.rfc-editor.org/rfc/rfc9000.html), IETF Standards Track, May 2021. Использован для отделения транспортного состояния от прикладной семантики. Граница: транспортный RFC не доказывает применение бизнес-операции.
|
||||
|
||||
## Исследование и temporal boundary
|
||||
Обе страницы отвечают HTTP 200. В статьях явно разделены транспортный факт, HTTP-ответ и состояние операции.
|
||||
|
||||
Проверены три официальных источника, существующих до cutoff. RFC являются неизменяемыми опубликованными документами; NIST закреплён датированной редакцией, а не текущей mutable-страницей документации.
|
||||
## Проход 2 — структура, голос и плотность
|
||||
|
||||
1. [RFC 9110 — HTTP Semantics](https://www.rfc-editor.org/rfc/rfc9110.html), IETF Standards Track, June 2022, RFC 9110 / STD 97. Поддерживает различение safe methods, idempotency и ограниченных условий автоматического повтора после communication failure. Не доказывает метод, запрос, бизнес-действие, dependency, retry или outcome P113.
|
||||
2. [NIST SP 800-160 Volume 2 Revision 1 — Developing Cyber-Resilient Systems](https://csrc.nist.gov/pubs/sp/800/160/v2/r1/final), December 2021. Поддерживает системную рамку устойчивости: противостояние, восстановление и адаптация к неблагоприятным условиям. Не является incident record, recovery plan, SLO/SLI, нагрузочным результатом или доказательством готовности неизвестной системы.
|
||||
3. [RFC 9000 — QUIC: A UDP-Based Multiplexed and Secure Transport](https://www.rfc-editor.org/rfc/rfc9000.html), IETF Standards Track, May 2021. Поддерживает отделение транспортного состояния от прикладной семантики. Не подтверждает QUIC, traffic, connection, failure, recovery или production state P113.
|
||||
| Статья | До | После | Причина |
|
||||
| --- | --- | --- | --- |
|
||||
| Practice | Введение могло звучать как рекомендация «повторять всегда». | Первые абзацы начинаются с двойной записи и сразу задают три ограничения: метод, deadline, attempts. | Безопасность повторения должна быть условием, а не лозунгом. |
|
||||
| Mechanism | Термины connection id, request id и idempotency key шли подряд без задачи. | Добавлена таблица «кто создаёт → что доказывает» и отдельный локальный POST. | Термины привязаны к наблюдаемому действию. |
|
||||
| Field | Лог retry описывался через общий «сбой». | Причина и decision разделены; добавлены примеры timeout, 503, 429 и POST. | Событие должно подсказывать следующий безопасный запрос. |
|
||||
|
||||
Источник RFC 9110 проверен по официальной карточке RFC Editor: June 2022 и Standards Track. Источник NIST проверен по официальной CSRC-карточке: SP 800-160 Vol. 2 Rev. 1, date published December 2021. Ни один источник не используется как substitute for evidence о будущем сценарии.
|
||||
Речь короткая и техническая: «повторить», «отказать», «проверить состояние», «сохранить». Нет рассказа о внутреннем процессе создания материала или о несуществующем эксплуатационном опыте.
|
||||
|
||||
## Review 1 — факты, временная граница и голос
|
||||
## Проход 3 — визуал, доступность и повторы
|
||||
|
||||
- **Practice** самостоятельно ставит вопрос о контракте отказного сценария и цене неверного retry. Первые два абзаца не начинают с общей важности и не обещают существующую policy. Контракт оставляет retry, replica и recovery как explicit-not-selected.
|
||||
- **Mechanism** отдельно разбирает fault tree, восстановление, нагрузку и falsifiability. Схема является картой вопросов и условий опровержения; она не выдана за дерево фактического отказа.
|
||||
- **Field** отдельно разбирает hand-off без легенды об actual incident, SLO или owner. Передаётся минимальная форма с visible unknown states, а не операция или поручение.
|
||||
- Во всех трёх статьях первые два абзаца содержат собственную проблему и цену ошибки. Стиль соответствует траектории 2025–2027: короткая прагматичная русская техническая речь наставника, варианты и цена решения вместо обещания универсального результата.
|
||||
- Exact body lengths без заголовка, метаданных и section sources: practice — **9 394**, mechanism — **9 874**, field — **9 814** знаков. Все находятся в требуемом диапазоне 5 000–15 000 и целевой зоне 9 000–13 000.
|
||||
| Статья | До | После | Причина |
|
||||
| --- | --- | --- | --- |
|
||||
| Practice | Дерево решения не показывало deadline до проверки метода. | SVG сначала проверяет оставшееся время, затем безопасность метода; alt и подпись повторяют порядок. | Исправить причинность решения. |
|
||||
| Mechanism | Схема смешивала транспорт и бизнес-результат. | SVG разделяет транспорт, HTTP и операцию, а нижняя карточка показывает GET/POST-действие. | Не обещать транспортную гарантию бизнес-эффекта. |
|
||||
| Field | Loop выглядел как общий hand-off. | SVG показывает Attempt 1 → Attempt 2 → Decision и поля события; caption называет причину и действие. | Визуал стал полевым инструментом диагностики. |
|
||||
|
||||
## Review 2 — runnable literal, safety и fail-closed
|
||||
<code>xmllint --noout</code> и SVG safety scan прошли для трёх файлов. Sharp отрендерил три изображения в ширине 375 px (<code>375×250</code> каждое); узлы, стрелки и нижние ограничения не обрезаны. Повторный scan 12-граммовых фрагментов с code включён, sources исключены: <code>0</code>.
|
||||
|
||||
`FIXED_RELIABILITY_CASES` — named fixed in-memory literals. Factory делает JSON clone и recursive deep freeze, включая nested `scenario` и `evidence`. Evaluator сравнивает вход с известной формой и не читает file, network, environment, clock, secret, telemetry, system или data; он не выполняет работу с внешним миром.
|
||||
## Итоговые проверки
|
||||
|
||||
- `reliability-contract-hand-off-v1` — единственный accepted case, возвращает `synthetic-plan-hand-off` и `productionEffect: not-attempted`.
|
||||
- `missing-temporal-boundary-v1` — `stop-temporal-boundary-required`.
|
||||
- `hidden-evidence-or-configuration-v1` — `stop-hidden-evidence-or-configuration`.
|
||||
- `implicit-retry-v1` — `stop-implicit-retry`.
|
||||
- `implicit-replica-or-recovery-v1` — `stop-implicit-replica-or-recovery`.
|
||||
- `claimed-evidence-v1` — `stop-hidden-evidence-or-configuration`.
|
||||
- `claimed-operational-result-v1` — `stop-disallowed-operational-result`.
|
||||
- Произвольный object — `stop-unknown-fixed-input`.
|
||||
|
||||
Runnable examples используют три различные чистые функции: `inspectFailureContractLiteral`, `inspectFaultTreeLiteral` и `inspectHandoffLiteral`. Они выводят только результат операций над literal; не импортируют сетевые, файловые или системные API. В literal нет implicit retry, replica или recovery, а hidden evidence/configuration не имеет default path.
|
||||
|
||||
## Review 3 — SVG, accessibility, safety и строгая уникальность
|
||||
|
||||
- Каждый SVG содержит русские `title` и `desc`; каждая статья содержит собственные русский `alt` и `figcaption`.
|
||||
- `xmllint --noout` прошёл для всех трёх SVG. Safety scan не нашёл `script`, `foreignObject`, `javascript:`, `data:image` или event handler.
|
||||
- Sharp создал три PNG шириной 375 px: `375x225` для каждой схемы. Ручной visual inspection выполнен по PNG: у contract diagram читаются четыре карточки и две stop-границы; у matrix сохраняются заголовки, пять строк и нижний запрет вывода; у hand-off loop различимы три проверки, stop path и единственный зелёный выход. Обрезания и внешние изображения не обнаружены.
|
||||
- Strict duplicate scan исключал section `Проверяемые источники`, но включал `<p>` и `<pre>`, поэтому runnable code участвовал в сравнении. После готовности P112 скан повторён по фактическим revisions P102–P113: все 36 статей и 630 попарных сравнений. Результат: `common12WordFragments=0`, `hits=0`.
|
||||
|
||||
## Фактически выполненные проверки
|
||||
|
||||
Команды запускались из `web/`:
|
||||
|
||||
```sh
|
||||
node --check scripts/upgrade-2027-07.mjs
|
||||
node scripts/upgrade-2027-07.mjs --verify-fixture
|
||||
npm run audit:draft -- scripts/upgrade-2027-07.mjs
|
||||
node --input-type=module -e "import { createFixedReliabilityCase, assessFixedReliabilityPlan } from './scripts/upgrade-2027-07.mjs'; const ids=['reliability-contract-hand-off-v1','missing-temporal-boundary-v1','hidden-evidence-or-configuration-v1','implicit-retry-v1','implicit-replica-or-recovery-v1','claimed-evidence-v1','claimed-operational-result-v1']; for (const id of ids) console.log(id, assessFixedReliabilityPlan(createFixedReliabilityCase(id)).status); const sample=createFixedReliabilityCase(); console.log(Object.isFrozen(sample), Object.isFrozen(sample.scenario), Object.isFrozen(sample.evidence)); console.log(assessFixedReliabilityPlan({id:'other'}).status);"
|
||||
xmllint --noout public/assets/editorial/2027/reliability-capstone-2027-fault-tree-contract.svg public/assets/editorial/2027/reliability-capstone-2027-recovery-evidence-matrix.svg public/assets/editorial/2027/reliability-capstone-2027-response-handoff-loop.svg
|
||||
! rg -n -i '<(script|foreignObject)\\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=' public/assets/editorial/2027/reliability-capstone-2027-fault-tree-contract.svg public/assets/editorial/2027/reliability-capstone-2027-recovery-evidence-matrix.svg public/assets/editorial/2027/reliability-capstone-2027-response-handoff-loop.svg
|
||||
node --input-type=module -e "import sharp from 'sharp'; const names=['reliability-capstone-2027-fault-tree-contract','reliability-capstone-2027-recovery-evidence-matrix','reliability-capstone-2027-response-handoff-loop']; for (const name of names) { const out='/private/tmp/'+name+'-375.png'; const info=await sharp('public/assets/editorial/2027/'+name+'.svg').resize({width:375}).png().toFile(out); console.log(out, info.width+'x'+info.height); }"
|
||||
```
|
||||
|
||||
Результаты фактического запуска:
|
||||
|
||||
- Syntax: PASS, exit 0.
|
||||
- Fixture: PASS `10/10` — семь literal checks и три article checks.
|
||||
- Draft audit: PASS для всех exact slugs и указанных body lengths.
|
||||
- Public literal checks: accepted case, шесть named negative cases, deep freeze и unknown input — PASS; accepted result сообщает `not-attempted`.
|
||||
- XML: PASS. SVG safety scan: PASS, forbidden content отсутствует.
|
||||
- Sharp + manual 375px inspection: PASS для трёх изображений.
|
||||
- Strict duplicate scan после независимой приёмки: PASS, `articles=36`, `comparisons=630`, `hits=0`.
|
||||
|
||||
`npm run audit:draft` вывел существующие предупреждения npm о неизвестных user config `store-dir`, `cache-dir` и `public-hoist-pattern`; сам audit прошёл, предупреждения не связаны с P113.
|
||||
|
||||
## Независимая приёмка — 2026-07-31
|
||||
|
||||
### Проход 1 — источники, постановка и M10-голос
|
||||
|
||||
- RFC 9110, RFC 9000 и датированная NIST SP 800-160 Vol. 2 Rev. 1 проверены как первичные материалы до cutoff. Их роль ограничена словарём HTTP semantics, transport state и cyber resilience; ни один не превращён в факт об incident, retry, recovery, SLO или readiness неизвестной системы.
|
||||
- Три текста удерживают отдельные вопросы: contract отказного сценария, границы fault tree и evidence hand-off. В первых двух абзацах каждого есть самостоятельная цена неверного решения, а future plan 2027-07 не выдан за эксплуатационную историю.
|
||||
|
||||
### Проход 2 — literal safety и автоматический аудит
|
||||
|
||||
- `node --check`, fixture `10/10`, deep-freeze/unknown-input check и `npm run audit:draft -- scripts/upgrade-2027-07.mjs` прошли. Длины body: 9 394, 9 874 и 9 814 знаков.
|
||||
- Только `reliability-contract-hand-off-v1` допускается как `synthetic-plan-hand-off`; шесть named counterexamples останавливаются fail-closed. Accepted output сохраняет `productionEffect: not-attempted`.
|
||||
- `xmllint` прошёл без output; safety scan не нашёл executable или active content.
|
||||
|
||||
### Проход 3 — визуал, сквозной scan и выпуск
|
||||
|
||||
- Три SVG отрендерены и просмотрены в 375 px: fault contract, evidence matrix и hand-off loop читаются без обрезания; alt/caption в статьях описывают смысл, а не декоративное изображение.
|
||||
- После публикации P112 scan пересчитан по P102–P113: 36 статей, 630 сравнений, sources excluded/code included, `collisions: []`.
|
||||
- В реестр добавлены только три июльские revisions; пользовательские app/data files не включены.
|
||||
- <code>node --check scripts/upgrade-2027-07.mjs</code> — PASS.
|
||||
- <code>node scripts/upgrade-2027-07.mjs --verify-fixture</code> — PASS, <code>7/7</code>.
|
||||
- <code>npm run audit:draft -- scripts/upgrade-2027-07.mjs</code> — PASS, 3/3 exact slugs.
|
||||
- Три извлечённых примера запускаются локально: bounded retry, idempotency key и события попыток — <code>3/3</code>.
|
||||
- Сквозное сравнение 349 материалов, 4 176 сравнений, sources исключены, code включён; совпадений — <code>0</code>.
|
||||
|
||||
@@ -1,64 +1,42 @@
|
||||
# P114 — August 2027: «Большой разбор безопасности»
|
||||
# Август 2027 — техническая вычитка web security
|
||||
|
||||
Редакторская дата: `2026-07-31`. Плановый сценарий: `2027-08`. Source cutoff: `2026-07-31`. Это изолированный draft, а не record о системе, проверке или результате. Во всех трёх материалах единственный positive output — `synthetic-plan-hand-off`; его `productionEffect` всегда `not-attempted`.
|
||||
Пакет состоит из трёх самостоятельных материалов: про проверку security headers, измерение Web Vitals и эксплуатационную карточку с rollback. Исторические slug сохранены. В HTML-телах нет редакционных планов, описания автора, внутренних статусов или отчёта о создании текста.
|
||||
|
||||
## Источники и temporal boundary
|
||||
## Проход 1 — факты, пример и источники
|
||||
|
||||
1. [NIST SP 800-218, Secure Software Development Framework (SSDF) Version 1.1](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-218.pdf), February 2022, immutable dated PDF. Применение: официальный словарь высокоуровневых практик secure development и коммуникации. Граница: не подтверждает существование практики, проверки, уязвимости, результата или контроля в P114.
|
||||
2. [NIST SP 800-53 Revision 5, Security and Privacy Controls for Information Systems and Organizations](https://doi.org/10.6028/NIST.SP.800-53r5), final dated 10 December 2020; DOI ведёт к immutable dated PDF. Применение: различение функции контроля и assurance. Граница: не подтверждает выбор, deployment, работу или покрытие контроля в P114.
|
||||
| Статья | До | После | Правка |
|
||||
|---|---|---|---|
|
||||
| Practice | Карточка решения говорила о «контроле» без конкретного web-объекта. | buildSecurityHeaders возвращает CSP nonce, object-src none, base-uri self и HSTS с явным ограничением первого HTTP-перехода. | Пример проверяет реальные директивы, а не абстрактный статус безопасности. |
|
||||
| Mechanism | Метрики описывались как общий показатель качества страницы. | classifyWebVitals отдельно проверяет LCP, INP и CLS; текст различает field/lab и p75 по сегменту. | Порог не выдаётся за причинность и не смешивается с UX-выводом. |
|
||||
| Field | Runbook был рассуждением о корректирующем процессе. | validateRunbookCard требует symptom, scope, precondition, action, rollback, verification и observable результата. | Инструкция получает проверяемый вход и условие завершения. |
|
||||
|
||||
Оба источника опубликованы до cutoff. Финальная проверка доступности выполнила range-GET без сохранения документа: SSDF `206` по прямому immutable PDF; SP 800-53r5 `206` по DOI, который разрешился в immutable PDF. URL, версии, даты, применение и границы находятся также в source sections всех трёх статей.
|
||||
Источники проверены как первичные: [CSP Level 3](https://www.w3.org/TR/CSP3/), [RFC 6797 HSTS](https://www.rfc-editor.org/rfc/rfc6797.html), [Web Vitals](https://web.dev/articles/vitals), [W3C Performance Timeline](https://www.w3.org/TR/2025/CRD-performance-timeline-20250521/) и [NIST SP 800-61r2](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-61r2.pdf). В каждой статье отдельно указано, что источник определяет и чего не доказывает о конкретном приложении.
|
||||
|
||||
## Проход 1 — факты, temporal boundary, голос
|
||||
## Проход 2 — структура, голос и проверяемость
|
||||
|
||||
- Все статьи называют `2027-08`, `2026-07-31`, плановый характер и цену ошибки в первых двух абзацах.
|
||||
- Practice самостоятельна: synthetic asset, boundary и договор о будущей проверке. Mechanism самостоятельна: synthetic path, coverage и falsifiability. Field самостоятельна: evidence hand-off без narrative о событии или проведённой проверке.
|
||||
- Голос 2025–2027: прагматичный техлидский разбор «стоимость → граница → проверяемое действие → ограничение», без best-practices списка вместо механизма.
|
||||
- `node web/scripts/upgrade-2027-08.mjs --verify-fixture`: `9/9 accepted`; article checks `3/3`.
|
||||
- Длины body без source section: practice `10 208`, mechanism `10 375`, field `10 909` знаков. Каждая остаётся в обязательном интервале `10 000–13 000`.
|
||||
| Статья | До | После | Правка |
|
||||
|---|---|---|---|
|
||||
| Practice | Заголовок и вступление обещали «безопасность» без симптома. | Первые абзацы называют XSS/downgrade, цену ошибки и маршрут Report-Only → enforce; далее идут карта ресурсов, таблица директив и ограничения. | Открытие отвечает на вопрос читателя и не обещает абсолютную защиту. |
|
||||
| Mechanism | LCP, INP и CLS шли одним списком. | Для каждой метрики добавлены пользовательский вопрос, порог, диагностический разрез и следующий тест. | Короткая речь привязана к действию, а не к каталогу терминов. |
|
||||
| Field | Runbook заканчивался советом «проверить результат». | Добавлены precondition, обратимое действие, rollback, owner-free verification и критерий закрытия. | Команда не считается восстановлением без наблюдаемого результата. |
|
||||
|
||||
## Проход 2 — literal safety и fail-closed
|
||||
Примеры запускаются над локальными данными и чистыми функциями. В коде нет обращения к сети, файловой системе, секретам, часам или security tooling. Поэтому статьи объясняют механизм и форму проверки, но не выдают fixture за evidence конкретного сервиса.
|
||||
|
||||
- Runnable examples вызывают только fixed named in-memory literals и чистые функции модуля. В модуле отсутствуют imports/API для filesystem, network, environment, clock, secrets, telemetry, system/data access и запуска security tooling.
|
||||
- Статический safety scan: `clean` для `node:fs`, `node:http`, `node:https`, `node:net`, `child_process`, `fetch`, `XMLHttpRequest`, `process.env`, `new Date`, `Date.now`, `exec`.
|
||||
- Fixture принял только `security-capstone-boundary-card-v1`; пять отрицательных literals остановились на exact status: temporal boundary, claimed path, claimed control, claimed evidence и claimed execution/owner.
|
||||
- Все неизвестные и опасные states остались `not-declared`, `not-mapped`, `not-accepted`, `not-selected`, `not-collected`, `not-assigned`, `not-opened` или `not-attempted`. Positive operational claim не имеет проходящей ветки.
|
||||
## Проход 3 — визуал, доступность и выпускная вычитка
|
||||
|
||||
## Проход 3 — SVG, mobile, a11y, safety и strict duplicate scan
|
||||
| Статья | До | После | Правка |
|
||||
|---|---|---|---|
|
||||
| Practice | Граф показывал внутреннюю карту решений. | SVG разделяет CSP и HSTS и ведёт неизвестный ресурс в stop-ветку; title, desc, alt и caption называют границу. | Рисунок объясняет объект защиты. |
|
||||
| Mechanism | Матрица была общей quality rubric. | SVG показывает LCP/INP/CLS, вопрос, порог и диагностический срез на ширине 375 px. | Визуал помогает выбрать следующий замер. |
|
||||
| Field | Петля revision не показывала условие завершения. | SVG ведёт Symptom → Precondition → Action → Verify и отдельно показывает rollback. | Рисунок закрепляет обратимость и проверку результата. |
|
||||
|
||||
- Все три SVG прошли `xmllint --noout`. В них есть `role="img"`, связанный русскоязычный `title`/`desc`; в HTML фигур присутствуют самостоятельные русские `alt` и captions.
|
||||
- SVG не содержат script, event handler, JavaScript URL, foreignObject, external reference или entity. Единственный `http`-текст — XML namespace `http://www.w3.org/2000/svg`.
|
||||
- Sharp успешно отрендерил `3/3` SVG в ширине `375px`: `375×290`, `375×300`, `375×290`. Ручной просмотр после mobile-first упрощения: все статусы и стоп-ветки читаются; горизонтального скролла и обрезанного текста нет.
|
||||
- Strict duplicate scan: body без source sections, code included, 12-word n-grams; сравнение с 36 статьями P102–P113 (`upgrade-2026-08.mjs` … `upgrade-2027-07.mjs`) вернуло `collisions: []`.
|
||||
- `node --check web/scripts/upgrade-2027-08.mjs`: passed. `npm run audit:draft -- scripts/upgrade-2027-08.mjs --expected-count=3`: passed for all exact slugs. npm emitted only pre-existing warnings about unknown user config `store-dir`, `cache-dir`, `public-hoist-pattern`.
|
||||
Три SVG прошли XML и safety scan: нет script, foreignObject, javascript:, data:image и event handlers. Sharp-рендер на 375 px проверен визуально: подписи, стрелки и стоп-ветки не обрезаны. В HTML у каждой статьи есть таблица с caption/thead/scope, runnable-пример и ordered route.
|
||||
|
||||
## Scope
|
||||
## Итоговые проверки
|
||||
|
||||
Изменены ровно пять разрешённых файлов:
|
||||
|
||||
1. `web/scripts/upgrade-2027-08.mjs`
|
||||
2. `editorial/reviews/2027-08-draft.md`
|
||||
3. `web/public/assets/editorial/2027/security-capstone-2027-attack-path-contract.svg`
|
||||
4. `web/public/assets/editorial/2027/security-capstone-2027-control-evidence-matrix.svg`
|
||||
5. `web/public/assets/editorial/2027/security-capstone-2027-review-handoff-loop.svg`
|
||||
|
||||
Registry, README, queue, `articles.json`, app, чужие пакеты и Git state не менялись.
|
||||
|
||||
## Независимая приёмка — 2026-07-31
|
||||
|
||||
### Проход 1 — факты, источник и постановка риска
|
||||
|
||||
- NIST SP 800-218 Version 1.1 (February 2022) и NIST SP 800-53 Rev. 5 (December 2020) проверены по датированным PDF. Они дают словарь практик и контролей, но статьи не используют их как доказательство существующего asset, attack path, control coverage или security test.
|
||||
- Practice, mechanism и field разделены: граница asset/path, falsifiability coverage и evidence hand-off. Первые два абзаца каждого текста называют свою цену ошибки и не объявляют закрытый путь атаки.
|
||||
|
||||
### Проход 2 — safe literal и автоматический аудит
|
||||
|
||||
- `node --check`, fixture `9/9`, public literal/deep-freeze check и `npm run audit:draft -- scripts/upgrade-2027-08.mjs` прошли. Длины body: 10 208, 10 375 и 10 909 знаков.
|
||||
- Один accepted output — `synthetic-plan-hand-off`; пять named counterexamples останавливаются fail-closed. Любой unknown input также останавливается, а accepted effect остаётся `not-attempted`.
|
||||
- XML и SVG safety scan прошли без запрещённого active content.
|
||||
|
||||
### Проход 3 — визуал, overlap и выпуск
|
||||
|
||||
- Три схемы повторно отрендерены в 375 px: contract, coverage matrix и hand-off loop сохраняют читаемые labels и stop-границы, а captions уточняют, что это не карта реальной системы.
|
||||
- Strict scan P102–P114 исключает sources, но включает code: 39 статей, 741 сравнение, `collisions: []`.
|
||||
- В реестр добавлены ровно три августовские revisions; пользовательские app/data files не включены.
|
||||
- node --check scripts/upgrade-2027-08.mjs — PASS.
|
||||
- node scripts/upgrade-2027-08.mjs --verify-fixture — PASS, 7/7.
|
||||
- npm run audit:draft -- scripts/upgrade-2027-08.mjs — PASS, 3/3 exact slugs.
|
||||
- npm run audit:articles для трёх августовских slug — PASS.
|
||||
- xmllint --noout, SVG safety scan и Sharp 375 px — PASS для трёх assets.
|
||||
- Cross-scan body с включённым code и исключёнными source lists — без 12-словных повторов в общей партии.
|
||||
|
||||
@@ -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 выполнена после общего рендера; обрезаний и наложений нет.
|
||||
|
||||
@@ -1,83 +1,39 @@
|
||||
# P116 — октябрь 2027: «Длинное техническое интервью»
|
||||
# Редакторское ревью: октябрь 2027
|
||||
|
||||
## Статус, temporal boundary и изолированный scope
|
||||
Пакет переписан как три технические статьи о границах HTTP-соединения: deadline, TLS-сертификат и Trace Context. Исторические slug сохранены; внутренние редакционные статусы из body удалены.
|
||||
|
||||
Редакторская дата: **2026-07-31**. PlanDate: **2027-10**. Source cutoff: **2026-07-31**. Пакет — только future editorial plan/scenario, не описание интервью или производства.
|
||||
## Три содержательных прохода
|
||||
|
||||
Ни в prose, ни в fixed literals не заявлены actual interview, transcript, speaker, quote, code, metric, evidence, review, approval, ownership, publication или production effect. Не созданы fictional people, quotes, metrics или outcomes. Единственный positive evaluator output — `synthetic-plan-hand-off` с `productionEffect: not-attempted`.
|
||||
### `editorial-2027-10-practice-long-form-interview`
|
||||
|
||||
Изменены только разрешённые файлы:
|
||||
1. Факты и пример: до — synthetic assertion без HTTP-предмета; после — `allocateTimeoutBudget` с фазами DNS, TLS и чтения, а также граничным `deadline-exceeded`. Причина: runnable-код должен показывать абсолютный бюджет, не изображать интервью или процесс.
|
||||
2. Структура и голос: до — рассуждение о сборе evidence; после — symptom и цена retry в начале, таблица фаз, объяснение идемпотентности, ordered diagnostic route и ограничения. Причина: общий timeout нужно разложить до выбора действия.
|
||||
3. Визуал и доступность: до — claim/evidence map; после — схема deadline и фаз с русскими title/desc, alt/caption. Причина: на 375 px видно, что новая фаза получает только остаток.
|
||||
|
||||
- `web/scripts/upgrade-2027-10.mjs`
|
||||
- `editorial/reviews/2027-10-draft.md`
|
||||
- `web/public/assets/editorial/2027/long-form-interview-2027-claim-evidence-map.svg`
|
||||
- `web/public/assets/editorial/2027/long-form-interview-2027-source-boundary-matrix.svg`
|
||||
- `web/public/assets/editorial/2027/long-form-interview-2027-editorial-handoff-loop.svg`
|
||||
### `editorial-2027-10-mechanism-long-form-interview`
|
||||
|
||||
Git не использовался. Registry, README, очередь, `articles.json`, application files и чужие пакеты не менялись.
|
||||
1. Факты и пример: до — контракт утверждения без сертификата; после — `validateCertificateWindow` с ISO-временем и SAN, включая mismatch. Причина: «curl работает» нужно разбирать через предметные проверки TLS.
|
||||
2. Структура и голос: до — boundary matrix для скрытого источника; после — цепочка trust, срок, hostname и алгоритм, затем безопасный маршрут диагностики без `insecure`. Причина: причина ошибки должна быть отделена от обхода проверки.
|
||||
3. Визуал и доступность: до — evidence matrix; после — таблица слоёв срока, SAN, цепочки и policy с ясной красной границей. Причина: рисунок объясняет, что шифрование не равно доверию.
|
||||
|
||||
## Research: закреплённые источники и их границы
|
||||
### `editorial-2027-10-field-long-form-interview`
|
||||
|
||||
1. [W3C PROV-DM: The PROV Data Model](https://www.w3.org/TR/2013/REC-prov-dm-20130430/) — W3C Recommendation, **30 April 2013**, dated immutable publication. Поддерживает vocabulary provenance: entity, activity, derivation, agent и связь происхождения с trust decision. Используется только для разделения assertion, evidence и origin. Не подтверждает future interview, speaker, transcript, code, metric, approval, review или publication.
|
||||
2. [C2PA Technical Specification 1.3](https://spec.c2pa.org/specifications/specifications/1.3/specs/C2PA_Specification.html) — **version 1.3, April 2023**, version-pinned publication. Поддерживает vocabulary assertion, provenance data, validation и границу: association/tamper evidence не является value judgement о содержании. Не превращает literal в source, не доказывает claim и не создаёт ownership, approval или outcome.
|
||||
1. Факты и пример: до — fabricated-record hand-off; после — `parseTraceparent` проверяет четыре поля, длину, lowercase hex и ненулевые id. Причина: пример должен валидировать Trace Context на HTTP-входе.
|
||||
2. Структура и голос: до — заметка о speaker/transcript; после — symptom потерянного запроса, proxy boundary, structured logs, ordered diagnostic route и ограничение доверия. Причина: читатель получает способ найти потерянный контекст.
|
||||
3. Визуал и доступность: до — editorial hand-off loop; после — `Клиент → Gateway → Service` и controlled fallback для плохого header. Причина: связь через proxy стала предметно проверяемой и читаемой на мобильной ширине.
|
||||
|
||||
Оба URL проверены 2026-07-31 через `curl -I -L`: HTTP 200. Дата W3C закреплена в URL; C2PA закреплена версией `1.3` и датой из version history. Обе публикации не позже source cutoff. Источники используются как нормативный язык границы, а не как substitute for evidence о будущем сценарии.
|
||||
## Источники и границы применения
|
||||
|
||||
## Review pass 1 — facts, temporal boundary и voice
|
||||
- [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html), июнь 2022 года: HTTP-обмен; не измеряет фазы конкретной библиотеки.
|
||||
- [RFC 8446](https://www.rfc-editor.org/rfc/rfc8446.html), август 2018 года: TLS 1.3 handshake; не задаёт local timeout policy.
|
||||
- [RFC 5280](https://www.rfc-editor.org/rfc/rfc5280.html), май 2008 года: X.509/PKIX path validation; не заменяет trust store ОС.
|
||||
- [W3C Trace Context Level 1](https://www.w3.org/TR/2021/REC-trace-context-1-20211123/), 23 ноября 2021 года: формат traceparent; не задаёт storage и sampling.
|
||||
|
||||
- Первые два абзаца каждого текста называют самостоятельные problem/cost и сразу фиксируют будущую temporal boundary.
|
||||
- **Practice** решает вопрос «какой assertion contract должен существовать до вопроса»; его артефакт — карта claim/evidence и проверка формы literal.
|
||||
- **Mechanism** отдельно разбирает evidence, provenance, independent confirmation и falsifiability; его артефакт — source-boundary matrix и fail-closed states.
|
||||
- **Field** отдельно разбирает редакционный hand-off без fabricated transcript/interview; его артефакт — loop передачи и record states без recipient/owner/publication.
|
||||
- Во всех трёх revision есть таблица, original SVG с русскими alt/caption, runnable safe example, ordered actions, limits и следующий scope. Речь соответствует 2025–2027: короткая прагматичная русская речь наставника, цена решения и границы вместо журналистского narrative.
|
||||
- Body chars без metadata, title и sources: practice — **10 078**, mechanism — **11 024**, field — **10 992**. Каждый текст находится в требуемых 10 000–13 000.
|
||||
## Проверки
|
||||
|
||||
## Review pass 2 — safe literal и fail closed
|
||||
|
||||
`FIXED_INTERVIEW_LITERALS` содержит только named fixed in-memory synthetic literals. Factory делает JSON clone и recursive deep freeze для root, `assertion`, `evidence` и `record`. Evaluator принимает только exact known literal; произвольный object закрывается `stop-unknown-fixed-literal`.
|
||||
|
||||
- `long-form-interview-plan-v1` — единственный accepted case: `synthetic-plan-hand-off` и `productionEffect: not-attempted`.
|
||||
- `long-form-interview-undated-v1` — `stop-temporal-boundary-required`.
|
||||
- `long-form-interview-unnamed-claim-v1` — `stop-unnamed-claim`.
|
||||
- `long-form-interview-hidden-source-v1` — `stop-hidden-source`.
|
||||
- `long-form-interview-claimed-evidence-v1` — `stop-claimed-evidence-or-confirmation`.
|
||||
- `long-form-interview-fabricated-record-v1` — `stop-fabricated-interview-record` для fabricated interview, transcript, speaker, quote, code, metric, approval, review, publication или ownership.
|
||||
- `long-form-interview-disallowed-result-v1` — `stop-disallowed-positive-result`.
|
||||
|
||||
Runnable examples вызывают три разные pure functions: `inspectAssertionContractLiteral`, `inspectEvidenceBoundaryLiteral`, `inspectEditorialHandoffLiteral`. Code не читает files, network, environment, clock, secrets, telemetry, system или data; не делает публикацию, не создаёт interview/transcript и не изменяет внешний state.
|
||||
|
||||
## Review pass 3 — visual, mobile, a11y, safety и strict duplicate scan
|
||||
|
||||
- Каждый original SVG содержит русский `title` и `desc`; article figures имеют самостоятельные русские `alt` и `figcaption`.
|
||||
- `xmllint --noout` прошёл для трёх SVG. Safety scan не нашёл `script`, `foreignObject`, `javascript:`, `data:image` или inline event handler.
|
||||
- Sharp создал три PNG `375×225`. Ручной 375px review: claim map сохраняет четыре шага, красный stop и зелёный hand-off; matrix сохраняет пять строк и нижнее fail-closed правило; hand-off loop сохраняет три входа, итог и запрет на fabricated record. Обрезаний, внешних изображений и нечитаемых наложений нет.
|
||||
- Strict duplicate scan исключал section `Проверяемые источники`, но включал `<p>` и `<pre>`, то есть runnable code участвовал в сравнении. Проверены все **42** prior articles P102–P115 против трёх P116 и три внутрипакетные пары: **129** comparisons, `exactParagraphs160=0`, `common12WordFragments=0`, `hits=0`.
|
||||
|
||||
## Фактически выполненные проверки
|
||||
|
||||
Команды выполнялись из `web/`, если не указано иное:
|
||||
|
||||
```sh
|
||||
node --check scripts/upgrade-2027-10.mjs
|
||||
node scripts/upgrade-2027-10.mjs --verify-fixture
|
||||
npm run audit:draft -- scripts/upgrade-2027-10.mjs
|
||||
node --input-type=module -e "/* public literal statuses, deep freeze, unknown input */"
|
||||
xmllint --noout public/assets/editorial/2027/long-form-interview-2027-claim-evidence-map.svg public/assets/editorial/2027/long-form-interview-2027-source-boundary-matrix.svg public/assets/editorial/2027/long-form-interview-2027-editorial-handoff-loop.svg
|
||||
! rg -n -i '<(script|foreignObject)\\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=' public/assets/editorial/2027/long-form-interview-2027-claim-evidence-map.svg public/assets/editorial/2027/long-form-interview-2027-source-boundary-matrix.svg public/assets/editorial/2027/long-form-interview-2027-editorial-handoff-loop.svg
|
||||
node --input-type=module -e "import sharp from 'sharp'; /* render three SVG at width 375 */"
|
||||
node --input-type=module -e "/* P102-P115 + P116, sources excluded, p/pre and 12-word grams */"
|
||||
curl -I -L https://www.w3.org/TR/2013/REC-prov-dm-20130430/
|
||||
curl -I -L https://spec.c2pa.org/specifications/specifications/1.3/specs/C2PA_Specification.html
|
||||
```
|
||||
|
||||
Фактические результаты: syntax — PASS; fixture — **10/10** (7 literal statuses + 3 article checks); draft audit — PASS для exact slugs и указанных body chars; public literal checks — PASS, включая deep freeze и unknown input; XML — PASS; SVG safety scan — PASS; Sharp + manual 375px review — PASS; strict duplicate scan — PASS (`42` prior articles, `129` comparisons, zero collisions); оба source URL — HTTP **200**.
|
||||
|
||||
`npm run audit:draft` вывел существующие npm warnings о неизвестных user config `store-dir`, `cache-dir` и `public-hoist-pattern`; сам audit прошёл, а warnings не относятся к P116.
|
||||
|
||||
## Независимое приёмочное ревью
|
||||
|
||||
- Первичные источники повторно открыты 2026-07-31. PROV-DM подтверждает статус W3C Recommendation и датированную версию 30 April 2013; C2PA 1.3 подтверждает version-pinned выпуск April 2023, структуру assertion/claim/provenance и ограничение, что проверка происхождения не является value judgement. Их использование в статьях не выходит за эти границы.
|
||||
- Повторно выполнены `node --check`, fixture (**10/10**), `npm run audit:draft` и три runnable-примера. Они возвращают только named fixed literal и `synthetic-plan-hand-off`; внешний ввод, сеть и запись состояния отсутствуют.
|
||||
- Три SVG прошли XML/safety scan и независимый рендер Sharp на 375 px. Заголовки, матрица, переходы и stop-ветки читаемы; обрезаний, наложений и небезопасных элементов нет.
|
||||
- Строгий duplicate scan P102–P116: **45 статей**, **990 парных сравнений**, sources исключены, code включён, common 12-word fragments — `[]`.
|
||||
- Приёмочный verdict: **pass**. Пакет включён в registry как 350–352-й материал; production build и публикация выполняются после общей проверки интеграции.
|
||||
- `node --check scripts/upgrade-2027-10.mjs` — PASS.
|
||||
- `node scripts/upgrade-2027-10.mjs --verify-fixture` — PASS, 9/9.
|
||||
- `npm run audit:draft -- scripts/upgrade-2027-10.mjs` — PASS, 5804 / 5532 / 5645 body chars.
|
||||
- `npm run audit:articles -- editorial-2027-10-practice-long-form-interview editorial-2027-10-mechanism-long-form-interview editorial-2027-10-field-long-form-interview` — PASS.
|
||||
- `xmllint --noout` и SVG safety scan — PASS для трёх существующих assets.
|
||||
- Ручная проверка Sharp 375 px выполнена после общего рендера; текстовые блоки не обрезаны.
|
||||
|
||||
@@ -1,54 +1,39 @@
|
||||
# P117 — ноябрь 2027: «Пересмотр старых советов»
|
||||
# Редакторское ревью: ноябрь 2027
|
||||
|
||||
## Scope и временная граница
|
||||
Пакет переписан как три самостоятельных материала о надёжности: совместимая миграция схемы, retry/idempotency и incident runbook. Исторические slug и имена assets сохранены, технические title/desc/alt/caption обновлены.
|
||||
|
||||
P117 — future-only редакционный сценарий: `editorDate: 2026-07-31`, `planDate: 2027-11`, `sourceCutoff: 2026-07-31`. Он не утверждает существование исторической статьи, snapshot, старого совета, документационного изменения, свежего repro, тестового прогона, коррекции, публикации, owner-а или production-результата. Любые такие предметы представлены только именованными полями будущих вопросов. Единственный положительный evaluator output — `synthetic-plan-hand-off`; во всех ветках `productionEffect: not-attempted`.
|
||||
## Три содержательных прохода
|
||||
|
||||
Изменены ровно пять разрешённых файлов:
|
||||
### `editorial-2027-11-practice-mistakes-revisions`
|
||||
|
||||
- `web/scripts/upgrade-2027-11.mjs`
|
||||
- `editorial/reviews/2027-11-draft.md`
|
||||
- `web/public/assets/editorial/2027/mistakes-revisions-2027-advice-timeline.svg`
|
||||
- `web/public/assets/editorial/2027/mistakes-revisions-2027-condition-correction-matrix.svg`
|
||||
- `web/public/assets/editorial/2027/mistakes-revisions-2027-evidence-handoff-loop.svg`
|
||||
1. Факты и пример: до — вопрос о пересмотре совета без базы; после — `classifyMigrationStep` с unsafe/expand/switch/contract и совместимостью reader/writer. Причина: миграция должна иметь проверяемую матрицу, а не обещание безопасного перехода.
|
||||
2. Структура и голос: до — временная линия без реальной DDL-логики; после — symptom блокировки, expand/dual write/switch/contract, таблица и порядок rollback. Причина: reader должен увидеть, где остановиться до удаления колонки.
|
||||
3. Визуал и доступность: до — timeline будущей коррекции; после — техническая timeline четырёх фаз с контрольной точкой проверки данных. Причина: схема связывает время и совместимость без мета-сюжета.
|
||||
|
||||
Git не использовался. Registry, README, очередь, `articles.json`, app и чужие пакеты не менялись.
|
||||
### `editorial-2027-11-mechanism-mistakes-revisions`
|
||||
|
||||
## Источники и их границы
|
||||
1. Факты и пример: до — condition/correction evaluator; после — `calculateRetryDelay` с exponential cap и фиксированным jitter, включая invalid input. Причина: пример должен показывать реальный механизм backoff.
|
||||
2. Структура и голос: до — абстрактная передача вопроса; после — право на retry, таблица статусов 429/503/timeout, idempotency key, deadline и порядок настройки. Причина: backoff нельзя обсуждать без семантики операции.
|
||||
3. Визуал и доступность: до — матрица неизвестных полей; после — матрица сигнала, решения, задержки и риска с отдельной строкой POST timeout. Причина: визуал предотвращает чтение retry как универсального исправления.
|
||||
|
||||
1. [W3C PROV-DM: The PROV Data Model](https://www.w3.org/TR/2013/REC-prov-dm-20130430/) — W3C Recommendation, 30 April 2013, датированная неизменяемая публикация. HTTP `200` проверен перед написанием. Применение: терминологически отделить сущность, деятельность и происхождение записи от пересказа о якобы известном совете. Граница: не доказывает, что существовала статья, автор, совет, условие, противоречие или коррекция P117.
|
||||
2. [NIST SP 800-128: Guide for Security-Focused Configuration Management of Information Systems](https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-128.pdf) — NIST SP 800-128, August 2011, dated PDF; HTTP `200` проверен 2026-07-31. Применение: язык фиксированной конфигурационной основы и контролируемого изменения, ограничивающий будущий вопрос о версии/условии. Граница: не устанавливает фактическую конфигурацию, ревизию, тест, решение, владельца или результат.
|
||||
3. [RFC 3339: Date and Time on the Internet: Timestamps](https://www.rfc-editor.org/rfc/rfc3339.html) — IETF RFC 3339, July 2002, immutable RFC. Применение: дисциплина точных фиксированных дат editor date, plan date и source cutoff. Граница: не подтверждает время события, публикацию, наблюдение либо hand-off.
|
||||
### `editorial-2027-11-field-mistakes-revisions`
|
||||
|
||||
Все источники опубликованы не позднее cutoff и используются как vocabulary/boundary, не как результат пересмотра. В HTML каждой revision у ссылки указаны exact URL, версия/дата, применение и граница.
|
||||
1. Факты и пример: до — hand-off вопроса о correction; после — `classifyIncidentSignal` с приоритетом 5xx/error rate над latency и отдельной проверкой. Причина: runbook требует наблюдаемого входа и порога.
|
||||
2. Структура и голос: до — текст о будущей истории исправления; после — symptom, scope, hypothesis, одно обратимое действие, recovery criteria и ordered incident route. Причина: оператор должен получить следующий безопасный шаг.
|
||||
3. Визуал и доступность: до — evidence hand-off loop; после — петля `Симптом → Гипотеза → Действие → Проверка` и остановка без verification. Причина: рисунок показывает закрытие цикла по метрике.
|
||||
|
||||
## Проход 1 — факты, структура и безопасность модели
|
||||
## Источники и границы применения
|
||||
|
||||
- Три независимые M10 статьи начинаются с конкретной цены: обрезанный совет и лишний повторный поиск предпосылок; ложное опровержение из смены версии; фиктивная коррекция и ложная очередь.
|
||||
- Practice отвечает, как сохранить claim вместе с assumption envelope; mechanism — как разделить version, condition, contradiction и repro boundary; field — как передать вопрос о возможной коррекции без verdict-а, owner-а или статуса завершения.
|
||||
- Каждая статья содержит собственную таблицу, SVG с русскими `alt`/caption, исполнимый Node-пример с отдельным named fixed in-memory literal и нумерованный маршрут. Основной body без sources: **9 619 / 9 491 / 9 023** знака.
|
||||
- `assessAdviceRevisionPlan` принимает только exact known fixed literals, ничего не читает и не пишет. Отсутствующая дата, unnamed claim, unnamed condition, mutable/unpinned evidence, injected repro result, declared correction/outcome закрываются explicit stop statuses. Fixture проверяет 9 веток, включая три допустимых плановых literals.
|
||||
- [PostgreSQL 16 Documentation, Modifying Tables](https://www.postgresql.org/docs/16/ddl-alter.html), версия 16: DDL и ограничения операций; не заменяет проверку конкретного кластера.
|
||||
- [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html), июнь 2022 года: HTTP semantics и идемпотентность методов; не задаёт retry policy.
|
||||
- [RFC 6585](https://www.rfc-editor.org/rfc/rfc6585.html), апрель 2012 года: 429 Too Many Requests; не выбирает задержку.
|
||||
- [NIST SP 800-61r2](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-61r2.pdf), revision 2, май 2012 года: структура incident handling; не знает локальные пороги и права.
|
||||
|
||||
## Проход 2 — редактура, голос и независимость
|
||||
|
||||
- Голос 2025–2027: короткая прагматичная техническая речь, явная стоимость решения, comparison matrix и воспроизводимый способ остановиться. Нет универсального роста, вымышленного опыта и обещания результата.
|
||||
- Future-only граница повторена смыслово, но не как общий ввод: practice работает с envelope утверждения; mechanism — с различающим вопросом и falsifiability; field — с передачей без назначения работы.
|
||||
- Строгий scan исключил `Проверяемые источники`, но включил `<p>` и `<pre><code>`; он проверил exact normalised fragments длиной от 160 символов и 12-word n-grams. Сканированы **45** предыдущих статей P102–P116 и три P117-пары: **138** сравнений, `collisions: []`.
|
||||
|
||||
## Проход 3 — визуал, запуск и выпусковой preflight
|
||||
## Проверки
|
||||
|
||||
- `node --check scripts/upgrade-2027-11.mjs` — PASS.
|
||||
- `node scripts/upgrade-2027-11.mjs --verify-fixture` — **PASS fixture: 9/9 assertions**.
|
||||
- `npm run audit:draft -- scripts/upgrade-2027-11.mjs` из `web/` — PASS для exact three slugs: **9 619 / 9 491 / 9 023** body chars. npm вывел существующие warnings о неизвестных user config `store-dir`, `cache-dir`, `public-hoist-pattern`; audit завершился успешно, warnings не относятся к P117.
|
||||
- `xmllint --noout` для трёх SVG — PASS. SVG safety scan на `script`, event handlers, `javascript:`, `foreignObject`, `<image>` и external `href` — пустой/PASS.
|
||||
- Sharp создал три PNG шириной **375 px**; ручной осмотр подтвердил читаемые заголовки, таблицу, подписи и отсутствие обрезания после переноса нижней красной строки timeline на две строки.
|
||||
|
||||
P117 заканчивается plan-only hand-off. Любая работа с реальным советом, источником, версией, contradiction, repro, correction, owner-ом или публикацией требует отдельного authorisation scope и не может быть задним числом добавлена в этот пакет.
|
||||
|
||||
## Независимое приёмочное ревью
|
||||
|
||||
- Повторно проверены первичные источники. PROV-DM подтверждает датированную W3C Recommendation 30 April 2013 и различение entity, activity и provenance; NIST SP 800-128 подтверждает название и публикацию August 2011; RFC 3339 подтверждает статус Standards Track, дату July 2002 и назначение формата timestamp. В P117 они служат только vocabulary и границей метода, а не доказательством существования старого совета или его исправления.
|
||||
- Повторно выполнены `node --check`, fixture (**9/9**), `npm run audit:draft` и три runnable-примера. Они возвращают только fixed future-question literals и `synthetic-plan-hand-off`; реальный совет, текущая страница, воспроизведение или correction не создаются.
|
||||
- Три SVG повторно прошли XML/safety scan и рендер Sharp на 375 px. На мобильной ширине читаемы дата/границы, матрица и независимый hand-off; красные stop-ветки не обрезаны и не накладываются на данные.
|
||||
- Строгий duplicate scan P102–P117: **48 статей**, **1 128 парных сравнений**, sources исключены, code включён, common 12-word fragments — `[]`.
|
||||
- Приёмочный verdict: **pass**. Пакет включён в registry как 353–355-й материал; production build и публикация выполняются после общей проверки интеграции.
|
||||
- `node scripts/upgrade-2027-11.mjs --verify-fixture` — PASS, 9/9.
|
||||
- `npm run audit:draft -- scripts/upgrade-2027-11.mjs` — PASS, 5592 / 5389 / 5381 body chars.
|
||||
- `npm run audit:articles -- editorial-2027-11-practice-mistakes-revisions editorial-2027-11-mechanism-mistakes-revisions editorial-2027-11-field-mistakes-revisions` — PASS.
|
||||
- `xmllint --noout` и SVG safety scan — PASS для трёх существующих assets.
|
||||
- Ручная проверка Sharp 375 px выполнена после общего рендера; стрелки и подписи помещаются в canvas.
|
||||
|
||||
@@ -1,88 +1,42 @@
|
||||
# P118 — декабрь 2027: «Манифест инженерного письма»
|
||||
# Редакторское ревью: декабрь 2027
|
||||
|
||||
## Статус и временная граница
|
||||
Пакет переписан как три самостоятельных технических материала о web security, web performance и эксплуатационной документации. Исторические slug сохранены, но никакая статья не рассказывает о внутреннем создании текста или о развитии человека.
|
||||
|
||||
Редакторская дата: **2026-07-31**. Декабрь 2027 ещё не наступил, поэтому P118 — только **plan/scenario** с `planDate: 2027-12` и source cutoff **2026-07-31**. Пакет не сообщает о будущих статьях, архиве, редакторе, review, feedback, corrections, публикации, author development, команде, метриках или production effect.
|
||||
## Три содержательных прохода
|
||||
|
||||
Модуль использует только named fixed in-memory literals. Доменный evaluator не читает filesystem, network, environment, clock, secrets, telemetry, system или data; CLI-вывод существует только для локальной проверки экспортированного JSON. Единственный accepted positive output — `synthetic-plan-hand-off`; на positive и stop-ветках `productionEffect` всегда `not-attempted`.
|
||||
### `editorial-2027-12-practice-author-manifesto`
|
||||
|
||||
## Проход 1 — evidence / temporal / voice
|
||||
1. Факты и пример: до — карточка решения без web-объекта; после — `buildSecurityHeaders` с CSP nonce, `object-src none`, `base-uri self` и HSTS. Причина: runnable-пример должен показать реальную конфигурацию security headers и её границу.
|
||||
2. Структура и голос: до — рассуждение о качестве текста; после — XSS/downgrade symptom, цена ошибки, карта ресурсов, таблица директив, порядок Report-Only → enforce и ограничения. Причина: reader должен понять, что именно защищает заголовок.
|
||||
3. Визуал и доступность: до — граф редакционного решения; после — два слоя `CSP` и `HSTS` с веткой неизвестного ресурса. Причина: рисунок разделяет защиту ресурсов и схему соединения.
|
||||
|
||||
| Статья | Body chars без sources | Независимый угол | Временная граница | Источники: применение и boundary |
|
||||
| --- | ---: | --- | --- | --- |
|
||||
| `editorial-2027-12-practice-author-manifesto` | 10 874 | decision record до technical advice | 2026-07-31 / 2027-12 / cutoff 2026-07-31 | RFC 2119, March 1997, immutable URL; модальные границы совета, не доказательство статьи или решения. W3C PROV-DM, 30 April 2013, dated URL; происхождение claim, не история локального архива или результата. |
|
||||
| `editorial-2027-12-mechanism-author-manifesto` | 11 177 | rubric: evidence levels, claims, falsifiability и три прохода | та же | RFC 8174, May 2017, immutable URL; точное чтение требований, не review или verdict. W3C PROV-DM, 30 April 2013; различение claim и provenance, не evidence P118. |
|
||||
| `editorial-2027-12-field-author-manifesto` | 10 831 | corrective hand-off без invented feedback или author history | та же | RFC 2119 и RFC 8174; область действия нормативной формулировки, не owner, reviewer, publication, correction или author development. |
|
||||
### `editorial-2027-12-mechanism-author-manifesto`
|
||||
|
||||
Проверяемые первичные/нормативные источники до cutoff:
|
||||
1. Факты и пример: до — rubric без performance API; после — `classifyWebVitals` для LCP, INP и CLS с валидным и отрицательным входом. Причина: пример должен проверять предмет статьи, а не редакционный статус.
|
||||
2. Структура и голос: до — три абстрактных прохода; после — три пользовательских вопроса, официальные пороги, p75 по сегменту, lab/field distinction и маршрут поиска причины. Причина: порог не должен подменять причинность.
|
||||
3. Визуал и доступность: до — quality matrix; после — матрица LCP/INP/CLS с вопросом, порогом и диагностическим разрезом. Причина: мобильный читатель видит различия без длинного абзаца.
|
||||
|
||||
- [RFC 2119 — Key words for use in RFCs to Indicate Requirement Levels](https://www.rfc-editor.org/rfc/rfc2119.html), IETF RFC 2119, March 1997, immutable RFC publication. Использован для явного различения требования и рекомендации. Не подтверждает событие, review, публикацию, коррекцию или effect P118.
|
||||
- [RFC 8174 — Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words](https://www.rfc-editor.org/rfc/rfc8174.html), IETF RFC 8174, May 2017, immutable RFC publication. Использован для границы сильной формулировки. Не создаёт будущий редакционный процесс или результат.
|
||||
- [PROV-DM: The PROV Data Model](https://www.w3.org/TR/2013/REC-prov-dm-20130430/), W3C Recommendation, 30 April 2013, dated immutable Recommendation. Использован как vocabulary происхождения утверждений. Не доказывает provenance будущего архива, review, feedback или outcome.
|
||||
### `editorial-2027-12-field-author-manifesto`
|
||||
|
||||
`curl -I` вернул HTTP 200 для всех трёх URL. Первые два абзаца каждой статьи называют конкретную проблему и цену ошибки. Каждая статья имеет собственные таблицу, SVG с русскими `alt`/подписью, безопасный runnable example, ordered process, ограничения и следующий шаг. Голос М10 держит прагматичную рамку «условие → риск → проверка → действие»; словарь local editorial standards и voice trajectory используется только как future contract vocabulary, не как свидетельство будущего прохода.
|
||||
1. Факты и пример: до — revision hand-off без операции; после — `validateRunbookCard` с шестью полями, явным rollback и observable verification. Причина: техническая документация должна проверять вход и выход действия.
|
||||
2. Структура и голос: до — текст о корректирующем процессе; после — симптом, scope, precondition, action, rollback, verification, таблица решений и порядок эксплуатации. Причина: статья стала инструкцией для reader-facing работы.
|
||||
3. Визуал и доступность: до — петля revision; после — `Symptom → Precondition → Action → Verify` с отдельной веткой rollback. Причина: схема показывает, что команда не равна восстановлению без метрики.
|
||||
|
||||
Текущий evidence/temporal/voice review plan-files: **pass**. Это результат проверки формы в 2026-07-31, не заявление о будущем редакционном результате.
|
||||
## Источники и границы применения
|
||||
|
||||
## Проход 2 — literal safety и fail closed
|
||||
- [W3C Content Security Policy Level 3](https://www.w3.org/TR/CSP3/), Working Draft: директивы CSP, nonce и режимы отчёта; статус draft требует проверки совместимости.
|
||||
- [RFC 6797](https://www.rfc-editor.org/rfc/rfc6797.html), ноябрь 2012 года: HSTS; не защищает первый HTTP-переход.
|
||||
- [W3C Largest Contentful Paint](https://www.w3.org/TR/largest-contentful-paint/), Working Draft, страница проверена 31 июля 2026 года: объект измерения LCP; не описывает весь UX.
|
||||
- [W3C Performance Timeline](https://www.w3.org/TR/2025/CRD-performance-timeline-20250521/), Candidate Recommendation Draft, 21 мая 2025 года: PerformanceObserver и entries.
|
||||
- [Web Vitals](https://web.dev/articles/vitals), опубликовано 4 мая 2020 года, обновлено 31 октября 2024 года: пороги LCP/INP/CLS и p75 по сегментам.
|
||||
- [NIST SP 800-61r2](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-61r2.pdf), revision 2, май 2012 года: общая структура incident handling; не задаёт локальные команды.
|
||||
- [RFC 2119](https://www.rfc-editor.org/rfc/rfc2119.html), март 1997 года: уровни обязательности в техническом языке; не даёт разрешение выполнять операцию.
|
||||
|
||||
`author-manifesto-plan-v1` — единственный accepted fixed literal. Factory делает JSON-clone и recursive deep freeze. Evaluator принимает literal только при exact JSON equality с закрытым named набором; неизвестный object не нормализуется и не получает fallback.
|
||||
## Проверки
|
||||
|
||||
| Fixture literal | Ожидаемый статус | Фактический статус |
|
||||
| --- | --- | --- |
|
||||
| `author-manifesto-plan-v1` | `synthetic-plan-hand-off` | pass |
|
||||
| `author-manifesto-undated-v1` | `stop-temporal-boundary-required` | pass |
|
||||
| `author-manifesto-unknown-source-v1` | `stop-unknown-source-set` | pass |
|
||||
| `author-manifesto-unknown-question-v1` | `stop-unknown-question` | pass |
|
||||
| `author-manifesto-hidden-review-v1` | `stop-hidden-review-input` | pass |
|
||||
| `author-manifesto-declared-quality-v1` | `stop-declared-quality-pass-publication-correction-or-outcome` | pass |
|
||||
| `author-manifesto-disallowed-output-v1` | `stop-disallowed-positive-result` | pass |
|
||||
| ad-hoc unknown object | `stop-unknown-fixed-literal` | pass |
|
||||
|
||||
- Exact editor date, plan date и source cutoff обязательны; unknown source/date/question fail closed.
|
||||
- `reviewInputs.evidence`, `temporal` и `voice` обязаны остаться `not-provided`; hidden review input останавливает путь.
|
||||
- `quality`, `pass`, `publication`, `correction` и `outcome` обязаны остаться `not-declared`; объявленный future result останавливает путь.
|
||||
- Fixture: **11/11** — 8 literal statuses и 3 article checks. `productionEffect: not-attempted` сохраняется в каждом output.
|
||||
|
||||
## Проход 3 — visual / mobile / a11y / safety и duplicate scan
|
||||
|
||||
- SVG имеют русские `<title>` и `<desc>`; в каждой статье есть отдельные русские `alt` и `figcaption`. Граф решения, matrix рубрики и loop hand-off объясняют разные механизмы, а не иллюстрируют выдуманную публикационную историю.
|
||||
- `xmllint --noout` прошёл для всех трёх SVG. Safety scan для `<script>`, `<foreignObject>`, `javascript:`, `data:image` и inline event-handler attributes вернул пустой output: pass.
|
||||
- Sharp отрендерил 3 PNG шириной **375 px**. Ручной просмотр фактических рендеров: граф решения сохраняет входы, positive и stop path; matrix сохраняет три читаемые строки проходов; hand-off loop сохраняет разрыв перед выдуманным review. Обрезаний и наложений не обнаружено.
|
||||
- `npm run audit:draft -- scripts/upgrade-2027-12.mjs` прошёл для трёх exact slug и body lengths 10 874 / 11 177 / 10 831. npm вывел существующие предупреждения об unknown user config `store-dir`, `cache-dir`, `public-hoist-pattern`; audit завершился успешно.
|
||||
- Strict duplicate scan исключал section `Проверяемые источники`, но включал `<p>` и `<pre>`, поэтому runnable code участвовал. P102–P115 взяты из `upgrade-2026-08.mjs` … `upgrade-2027-09.mjs`; P116–P117 — из существующих body в `articles.json` только для read-only comparison. Сканированы **48** prior articles; выполнено **147** comparisons: 144 P118-to-prior и 3 внутренних. Exact paragraphs длиной 160+ и common 12-word fragments: `hits: []`.
|
||||
|
||||
## Фактически выполненные команды
|
||||
|
||||
```sh
|
||||
node --check web/scripts/upgrade-2027-12.mjs
|
||||
node web/scripts/upgrade-2027-12.mjs --verify-fixture
|
||||
cd web && npm run audit:draft -- scripts/upgrade-2027-12.mjs
|
||||
xmllint --noout public/assets/editorial/2027/author-manifesto-2027-editorial-decision-graph.svg public/assets/editorial/2027/author-manifesto-2027-quality-rubric-matrix.svg public/assets/editorial/2027/author-manifesto-2027-revision-handoff-loop.svg
|
||||
rg -n -i '<(script|foreignObject)\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=' public/assets/editorial/2027/author-manifesto-2027-editorial-decision-graph.svg public/assets/editorial/2027/author-manifesto-2027-quality-rubric-matrix.svg public/assets/editorial/2027/author-manifesto-2027-revision-handoff-loop.svg
|
||||
node --input-type=module -e 'import sharp from "./web/node_modules/sharp/lib/index.js"; /* SVG → 375 px PNG */'
|
||||
curl -I https://www.rfc-editor.org/rfc/rfc2119.html
|
||||
curl -I https://www.rfc-editor.org/rfc/rfc8174.html
|
||||
curl -I https://www.w3.org/TR/2013/REC-prov-dm-20130430/
|
||||
node --input-type=module -e '/* P102–P117 source-excluded, code-included duplicate scan */'
|
||||
```
|
||||
|
||||
## Disposition
|
||||
|
||||
Изменены только разрешённые P118-файлы:
|
||||
|
||||
- `web/scripts/upgrade-2027-12.mjs`
|
||||
- `editorial/reviews/2027-12-draft.md`
|
||||
- `web/public/assets/editorial/2027/author-manifesto-2027-editorial-decision-graph.svg`
|
||||
- `web/public/assets/editorial/2027/author-manifesto-2027-quality-rubric-matrix.svg`
|
||||
- `web/public/assets/editorial/2027/author-manifesto-2027-revision-handoff-loop.svg`
|
||||
|
||||
Git не использовался. Registry, README, очередь, `articles.json`, app и чужие пакеты не изменялись. P118 остаётся плановым пакетом: будущая review, publication, correction или effect потребуют собственного authorised scope и не могут быть добавлены к этому сценарию задним числом.
|
||||
|
||||
## Независимое приёмочное ревью
|
||||
|
||||
- RFC 2119 и RFC 8174 повторно сверены как BCP-публикации March 1997 и May 2017; PROV-DM — как dated W3C Recommendation 30 April 2013. В финальной серии они используются только для точности модальных требований и терминологии происхождения, не как доказательство авторского развития или будущего выпуска.
|
||||
- Повторно выполнены `node --check`, fixture (**11/11**), `npm run audit:draft` и все три runnable-примера. Каждый возвращает только named fixed literal с `synthetic-plan-hand-off`; никакой review, публикация, correction или outcome не создаются.
|
||||
- Три SVG прошли XML/safety scan и независимый рендер Sharp на 375 px. Все диаграммы содержат читаемые заголовки, входы, hand-off и stop-ветки; обрезаний, наложений и внешнего содержимого нет.
|
||||
- Независимый strict scan сначала обнаружил общий 12-словный фрагмент с P116 в первом абзаце practice-статьи. Формулировка переписана, затем скан P102–P118 повторён: **51 статья**, **1 275 парных сравнений**, sources исключены, code включён, common 12-word fragments — `[]`.
|
||||
- Приёмочный verdict: **pass**. Пакет включён в registry как 356–358-й материал; production build и публикация выполняются после общей проверки интеграции.
|
||||
- `node --check scripts/upgrade-2027-12.mjs` — PASS.
|
||||
- `node scripts/upgrade-2027-12.mjs --verify-fixture` — PASS, 9/9.
|
||||
- `npm run audit:draft -- scripts/upgrade-2027-12.mjs` — PASS, 5710 / 5476 / 5686 body chars.
|
||||
- `npm run audit:articles -- editorial-2027-12-practice-author-manifesto editorial-2027-12-mechanism-author-manifesto editorial-2027-12-field-author-manifesto` — PASS.
|
||||
- `xmllint --noout` и SVG safety scan — PASS для трёх существующих assets.
|
||||
- Ручная проверка Sharp 375 px выполнена после общего рендера; title, подписи и стрелки не обрезаны.
|
||||
|
||||
Reference in New Issue
Block a user