# Автономное тройное ревью П45 · ноябрь 2021 · «Нагрузочное тестирование»
Статус: **готово к независимой интеграционной приёмке**. Это только author
package: registry, README, articles.json, общие audit scripts,
редакционные правила, очередь и чужие файлы не менялись. Git add, commit и
push не выполнялись.
Пакет создаёт ровно пять разрешённых файлов:
1. web/scripts/upgrade-2021-11.mjs;
2. editorial/reviews/2021-11-draft.md;
3. web/public/assets/editorial/2021/load-test-profile-2021.svg;
4. web/public/assets/editorial/2021/load-test-observation-2021.svg;
5. web/public/assets/editorial/2021/load-test-diagnosis-2021.svg.
Revision-модуль экспортирует ровно три overlay revision для stable slug:
- editorial-2021-11-practice-load-testing;
- editorial-2021-11-mechanism-load-testing;
- editorial-2021-11-field-load-testing.
В export нет полей date и author; следовательно,
исходные дата и автор берутся из архивной записи. Модуль не импортируется
registry и не изменяет базовый archive.
## Проход 1. Структура, тон и объём — пройдено
| Revision | Ситуация и цена в первых двух абзацах | Главный вопрос | Объём body |
| --- | --- | --- | ---: |
| Практика | У команды есть только просьба «нагрузить endpoint», а разные люди помнят разные данные и условия; цена — число без причины и случайное изменение кода или среды | Как описать workload, среду, data setup и stop criterion до выбора инструмента | **9 456** |
| Механизм | Есть aggregate «много запросов», но нет модели и возникает ложная причинность; цена — приписать изменение очереди, базе или коду без связи со сценарием | Почему arrival intent, профиль, observability и evidence packet не сводятся к total | **9 874** |
| Полевой разбор | После теста появляется error-signal или latency-signal без контекста; цена — поменять систему на основании другой среды, плохого сценария или не-измерения | Как отделить environment drift, scenario gap и synthetic boundary и выбрать обратимое действие | **9 973** |
- Все тексты находятся в коридоре П45 8–11 тыс. знаков и в обязательном
диапазоне 5–15 тыс. знаков.
- В каждом revision есть девять смысловых разделов, table с
caption/thead, figure с самостоятельными
alt/figcaption, рабочий JS example, нумерованный
маршрут «симптом → причина → проверка → действие», ограничения и пять
официальных либо нормативных ссылок.
- Голос соответствует M4 / ноябрю 2021: автор связывает endpoint, данные,
среду и наблюдение, но не изображает владельца production platform или
руководителя incident response. Термины arrival,
evidence packet, drift и
rollback-safe сразу привязаны к object, полю или действию.
- Из текстов удалены общие оценки и ложная уверенность. Нет придуманного
прогона, latency, RPS, error rate, пользователей, capacity, инцидента или
production verdict. В частности, latency-signal в field
прямо помечен как диагностическая метка, а не измерение.
Вердикт прохода: **пройден**. У каждого вывода есть прикладной артефакт и
названо ограничение, поэтому статья не обещает больше, чем может проверить.
## Проход 2. Техника, историческая рамка и fixture — пройдено
| Утверждение | Первичный или официальный источник | Зафиксированная граница |
| --- | --- | --- |
| k6 v0.35.0 опубликован 17 ноября 2021 года; release notes упоминают stage tags в связи с конкретными executors | [Grafana k6 v0.35.0 release](https://github.com/grafana/k6/releases/tag/v0.35.0) | Текст использует только историческую границу версии. Он не запускает k6, не создаёт VU и не переносит executor semantics в fixture. |
| В точном commit, на который указывает тег v0.35.0, sample thresholds связывает порог с именованной метрикой | [k6 fixed source snapshot 1c44b2d](https://github.com/grafana/k6/blob/1c44b2d0ecc16cbe788e773a1db019b6cbdad725/samples/thresholds.js) | Из sample взято требование называть metric вместе с порогом. Пакет не импортирует и не исполняет sample, HTTP или tool. |
| Тег OpenTelemetry Specification v1.0.0 существовал в феврале 2021 года, а его Metrics API имеет status experimental | [fixed Metrics API snapshot f228a83](https://github.com/open-telemetry/opentelemetry-specification/blob/f228a83e652e5cd3ba96b9f780b704ee7a7daa4c/specification/metrics/api.md), [fixed Trace API snapshot f228a83](https://github.com/open-telemetry/opentelemetry-specification/blob/f228a83e652e5cd3ba96b9f780b704ee7a7daa4c/specification/trace/api.md) | Источники нужны только для терминов measurement, instrument, trace и span. Evidence packet — локальный object, не OpenTelemetry export и не claim о внедрённой телеметрии. |
| Точное определение измеряемого свойства важнее названия графика | [RFC 2330](https://www.rfc-editor.org/rfc/rfc2330.html) | RFC задаёт рамку IP performance metrics, а не capacity contract application endpoint. Он не превращает synthetic units в benchmark. |
### Техническая граница fixture
runLoadTestingFixture() создаёт только arrays и plain objects в
памяти. Один нейтральный intent —
GET /fixture/neutral-resource — имеет
invocation: not-performed. Его профиль строго идёт в порядке
warm-up → steady → step → recovery.
У каждого segment есть:
- именованные plannedRequestSlots;
- acceptedUnits и rejectedUnits;
- syntheticBottleneckFlag;
- строка measurement boundary;
- неисполняемая отметка endpoint invocation.
Среда явно задаёт isolated-training-envelope-v1,
in-memory-object-evaluation и ограничение в три accepted
synthetic units на segment. Step намеренно имеет пять slots, поэтому
получает три accepted и два rejected units. Это заранее смоделированная
ветка проверки, не найденное bottleneck и не capacity результата.
Stop criterion срабатывает лишь после recovery, если последовательность
полна, flag виден только в step, slots согласованы с accepted/rejected
units, а recovery record присутствует. Packet содержит endpoint,
environment, data setup, profile, stop, diagnostic model и явную
measurement boundary. Плохой объект
many-requests-without-scenario не содержит endpoint, среды,
данных, profile или criterion и отклоняется как не-модель.
Проверены девять assertions:
1. порядок сегментов — ровно warm-up, steady, step, recovery;
2. environment и его constraint явны;
3. planned slots согласованы с accepted/rejected units;
4. synthetic bottleneck flag виден только в step;
5. остановка произошла по declared criterion после recovery;
6. synthetic units не имеют полей и смысла latency, throughput или RPS;
7. evidence packet полон;
8. bare aggregate отклонён;
9. external work не выполнялся.
Не моделируются и не выполняются HTTP, сеть, load tool, server, database,
browser, clock, file system, process, telemetry, latency, throughput,
error rate, RPS, пользователи, capacity, production incident или benchmark.
Fixture не выдаёт synthetic rejected unit за HTTP error и прямо хранит
latencySignal: not-collected-in-fixture.
Вердикт прохода: **пройден**. Исторические источники ограничивают словарь и
версию, а fixture доказывает собственные invariants, не приписывая их
внешней системе.
## Проход 3. SVG, ссылки и preflight — пройдено
- load-test-profile-2021.svg — мобильная вертикальная диаграмма
четырёх segments. В ней видны planned slots, accepted/rejected synthetic
units, единственный flag в step и явный запрет трактовать units как
latency, throughput, RPS, users или capacity.
- load-test-observation-2021.svg — вертикальная цепочка
«карточка workload → профиль → evidence packet»; в нижней карточке bare
total отклоняется как не-model.
- load-test-diagnosis-2021.svg — диагностический маршрут
environment drift, scenario gap и synthetic boundary. У каждой ветки есть
rollback-safe действие; latency в fixture не collected.
- У SVG есть title, desc,
role="img", контрастные элементы, короткие строки и
мобильный вертикальный viewBox. В XML нет script,
foreignObject, external asset reference или data URI.
- Sharp отрендерил все три SVG в PNG шириной 375 px. Финальные renders
просмотрены вручную: заголовки, карточки, стрелки и нижние ограничения
читаются; clipping, overlap и horizontal overflow после правок не
обнаружены.
### Фактически выполненные проверки
Команды выполнены из web/:
node --check scripts/upgrade-2021-11.mjs
npm run audit:draft -- scripts/upgrade-2021-11.mjs
node scripts/upgrade-2021-11.mjs --verify-fixture
xmllint --noout \
public/assets/editorial/2021/load-test-profile-2021.svg \
public/assets/editorial/2021/load-test-observation-2021.svg \
public/assets/editorial/2021/load-test-diagnosis-2021.svg
rg -n -i '<script|<foreignObject|(?:href|src)="(?:https?:|data:)|xlink:href=' \
public/assets/editorial/2021/load-test-profile-2021.svg \
public/assets/editorial/2021/load-test-observation-2021.svg \
public/assets/editorial/2021/load-test-diagnosis-2021.svg
node -e "import('sharp').then(async ({default: sharp}) => { ... resize({width:375}) ... })"
| Проверка | Реальный результат |
| --- | --- |
| node --check | PASS, code 0 |
| Draft gate | PASS: **9 456 / 9 874 / 9 973** знака body; найдены три archive slug, sections, tables, figures, code, routes, local assets и пять external sources в каждой статье |
| In-memory fixture | PASS: все девять assertions равны true; проверены order, environment, unit reconciliation, flag, criterion, unit meaning, packet, bad aggregate и отсутствие external work |
| xmllint --noout | PASS, три SVG — корректный XML |
| SVG safety scan | PASS: совпадений нет; rg завершился с code 1, что для поиска означает ожидаемый пустой результат |
| Sharp 375 px | PASS: созданы и просмотрены три PNG; после mobile-first правок clipping, overlap и horizontal overflow не найдены |
| Scope/self-review | PASS: создано только пять разрешённых P45 файлов; overlay не меняет date/author; registry, README, archive, audit scripts, правила, очередь, Git и mascot PNG не затронуты |
npm run audit:draft завершилась с code 0. npm вывел старые
предупреждения о пользовательских store-dir, cache-dir
и public-hoist-pattern; они не относятся к П45 и не менялись.
Не запускались strict audit после registry integration, production build,
browser, screen reader, HTTP-запрос к нейтральному endpoint, load tool,
server, database, сетевой workload, реальный benchmark, commit или
публикация. Официальные historical sources были прочитаны read-only для
fact-check; это не запуск сценария и не сетевой тест. Это намеренная граница
автономной партии.
## Итог
Три прохода завершены после исправления двух найденных проблем: в mechanism
первый абзац получил явную постановку проблемы для draft gate, а SVG были
перестроены в мобильную вертикальную композицию; у observation и diagnosis
убраны пересечение стрелки с текстом и обрезание нижней строки. П45 готова к
независимой интеграции без изменения shared state.
## Независимое редакторское ревью и интеграция
Статус: **принято и подключено в editorial overlay 31 июля 2026 года**.
### 1. Факты и техника
- Независимая проверка подтвердила дату релиза k6 v0.35.0 —
17 ноября 2021 года. Его lightweight-тег разрешается в commit
1c44b2d0ecc16cbe788e773a1db019b6cbdad725, который использован
в ссылке на samples/thresholds.js. Source действительно
связывает threshold с именованной метрикой; статья делает из этого только
ограниченный редакционный вывод, а не копирует API инструмента.
- Тег OpenTelemetry Specification v1.0.0 разрешается в commit
f228a83e652e5cd3ba96b9f780b704ee7a7daa4c. Его Metrics API
помечен Experimental и определяет instrument как средство
захвата raw measurements. Ссылки поэтому исторически фиксированы, а
evidence packet в статьях остаётся локальным object, не telemetry export.
- Повторный node --check прошёл. Draft audit подтвердил объёмы
9 456, 9 874 и 9 973 знака. Fixture дал 9 из 9 истинных assertions:
четыре сегмента идут в нужном порядке, step содержит единственный
synthetic flag и два rejected units, recovery завершает criterion, а bare
aggregate отвергается как не-модель. В нём по-прежнему нет HTTP, clock,
latency, RPS или нагрузки.
- После подключения overlay strict audit прошёл для всех трёх slug: у каждой
статьи по 1 figure, 1 table и 1 code example. В registry 130 revision,
из них ровно три ноябрьские; дубликатов slug нет. Как и требуется, overlay
не содержит date и author.
### 2. Редактура и голос
- Все три текста перечитаны после независимой source-проверки. Они не
подменяют workload абстрактным total, не выдают synthetic rejection за HTTP
error и не выносят verdict о capacity. Каждый оставляет конкретный следующий
шаг: описать разрешённый реальный запуск отдельно с версией, окружением,
входом и raw evidence.
- Тон соответствует ноябрю 2021: автор уже видит границы сценария, данных,
окружения и наблюдения, но не изображает опыт владельца production
platform. Термины привязаны к полям fixture и таблицам; выводы условны и
обратимы.
### 3. Визуал и выпуск
- Три SVG повторно прошли xmllint --noout; safety scan не нашёл
script, foreignObject, внешних URL или
data:image. Каждый файл отрендерен Sharp в ширину 375 px и
просмотрен вручную: профиль, evidence route и diagnostic cards остаются
читаемыми без overlap и horizontal clipping.
- npm run build завершилась с code 0 и сгенерировала 374
статические страницы. git diff --check также прошёл. Обычные
предупреждения npm о пользовательских store-dir,
cache-dir и public-hoist-pattern не изменялись и
не повлияли на результат.
Итог: ноябрьские статьи заменяют архивные записи через overlay. После этой
интеграции строгий аудит проходит **139 из 358**, остаётся **219**.