This commit is contained in:
@@ -0,0 +1,236 @@
|
||||
# Автономное тройное ревью П45 · ноябрь 2021 · «Нагрузочное тестирование»
|
||||
|
||||
Статус: **готово к независимой интеграционной приёмке**. Это только author
|
||||
package: registry, README, <code>articles.json</code>, общие audit scripts,
|
||||
редакционные правила, очередь и чужие файлы не менялись. Git add, commit и
|
||||
push не выполнялись.
|
||||
|
||||
Пакет создаёт ровно пять разрешённых файлов:
|
||||
|
||||
1. <code>web/scripts/upgrade-2021-11.mjs</code>;
|
||||
2. <code>editorial/reviews/2021-11-draft.md</code>;
|
||||
3. <code>web/public/assets/editorial/2021/load-test-profile-2021.svg</code>;
|
||||
4. <code>web/public/assets/editorial/2021/load-test-observation-2021.svg</code>;
|
||||
5. <code>web/public/assets/editorial/2021/load-test-diagnosis-2021.svg</code>.
|
||||
|
||||
Revision-модуль экспортирует ровно три overlay revision для stable slug:
|
||||
|
||||
- <code>editorial-2021-11-practice-load-testing</code>;
|
||||
- <code>editorial-2021-11-mechanism-load-testing</code>;
|
||||
- <code>editorial-2021-11-field-load-testing</code>.
|
||||
|
||||
В export нет полей <code>date</code> и <code>author</code>; следовательно,
|
||||
исходные дата и автор берутся из архивной записи. Модуль не импортируется
|
||||
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 с
|
||||
<code>caption</code>/<code>thead</code>, figure с самостоятельными
|
||||
<code>alt</code>/<code>figcaption</code>, рабочий JS example, нумерованный
|
||||
маршрут «симптом → причина → проверка → действие», ограничения и пять
|
||||
официальных либо нормативных ссылок.
|
||||
- Голос соответствует M4 / ноябрю 2021: автор связывает endpoint, данные,
|
||||
среду и наблюдение, но не изображает владельца production platform или
|
||||
руководителя incident response. Термины <code>arrival</code>,
|
||||
<code>evidence packet</code>, <code>drift</code> и
|
||||
<code>rollback-safe</code> сразу привязаны к object, полю или действию.
|
||||
- Из текстов удалены общие оценки и ложная уверенность. Нет придуманного
|
||||
прогона, latency, RPS, error rate, пользователей, capacity, инцидента или
|
||||
production verdict. В частности, <code>latency-signal</code> в field
|
||||
прямо помечен как диагностическая метка, а не измерение.
|
||||
|
||||
Вердикт прохода: **пройден**. У каждого вывода есть прикладной артефакт и
|
||||
названо ограничение, поэтому статья не обещает больше, чем может проверить.
|
||||
|
||||
## Проход 2. Техника, историческая рамка и fixture — пройдено
|
||||
|
||||
| Утверждение | Первичный или официальный источник | Зафиксированная граница |
|
||||
| --- | --- | --- |
|
||||
| k6 <code>v0.35.0</code> опубликован 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, на который указывает тег <code>v0.35.0</code>, sample thresholds связывает порог с именованной метрикой | [k6 fixed source snapshot 1c44b2d](https://github.com/grafana/k6/blob/1c44b2d0ecc16cbe788e773a1db019b6cbdad725/samples/thresholds.js) | Из sample взято требование называть metric вместе с порогом. Пакет не импортирует и не исполняет sample, HTTP или tool. |
|
||||
| Тег OpenTelemetry Specification <code>v1.0.0</code> существовал в феврале 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
|
||||
|
||||
<code>runLoadTestingFixture()</code> создаёт только arrays и plain objects в
|
||||
памяти. Один нейтральный intent —
|
||||
<code>GET /fixture/neutral-resource</code> — имеет
|
||||
<code>invocation: not-performed</code>. Его профиль строго идёт в порядке
|
||||
<code>warm-up → steady → step → recovery</code>.
|
||||
|
||||
У каждого segment есть:
|
||||
|
||||
- именованные <code>plannedRequestSlots</code>;
|
||||
- <code>acceptedUnits</code> и <code>rejectedUnits</code>;
|
||||
- <code>syntheticBottleneckFlag</code>;
|
||||
- строка measurement boundary;
|
||||
- неисполняемая отметка endpoint invocation.
|
||||
|
||||
Среда явно задаёт <code>isolated-training-envelope-v1</code>,
|
||||
<code>in-memory-object-evaluation</code> и ограничение в три 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. Плохой объект
|
||||
<code>many-requests-without-scenario</code> не содержит 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 и прямо хранит
|
||||
<code>latencySignal: not-collected-in-fixture</code>.
|
||||
|
||||
Вердикт прохода: **пройден**. Исторические источники ограничивают словарь и
|
||||
версию, а fixture доказывает собственные invariants, не приписывая их
|
||||
внешней системе.
|
||||
|
||||
## Проход 3. SVG, ссылки и preflight — пройдено
|
||||
|
||||
- <code>load-test-profile-2021.svg</code> — мобильная вертикальная диаграмма
|
||||
четырёх segments. В ней видны planned slots, accepted/rejected synthetic
|
||||
units, единственный flag в step и явный запрет трактовать units как
|
||||
latency, throughput, RPS, users или capacity.
|
||||
- <code>load-test-observation-2021.svg</code> — вертикальная цепочка
|
||||
«карточка workload → профиль → evidence packet»; в нижней карточке bare
|
||||
total отклоняется как не-model.
|
||||
- <code>load-test-diagnosis-2021.svg</code> — диагностический маршрут
|
||||
environment drift, scenario gap и synthetic boundary. У каждой ветки есть
|
||||
rollback-safe действие; latency в fixture не collected.
|
||||
- У SVG есть <code>title</code>, <code>desc</code>,
|
||||
<code>role="img"</code>, контрастные элементы, короткие строки и
|
||||
мобильный вертикальный viewBox. В XML нет <code>script</code>,
|
||||
<code>foreignObject</code>, external asset reference или data URI.
|
||||
- Sharp отрендерил все три SVG в PNG шириной 375 px. Финальные renders
|
||||
просмотрены вручную: заголовки, карточки, стрелки и нижние ограничения
|
||||
читаются; clipping, overlap и horizontal overflow после правок не
|
||||
обнаружены.
|
||||
|
||||
### Фактически выполненные проверки
|
||||
|
||||
Команды выполнены из <code>web/</code>:
|
||||
|
||||
<pre><code>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}) ... })"</code></pre>
|
||||
|
||||
| Проверка | Реальный результат |
|
||||
| --- | --- |
|
||||
| <code>node --check</code> | 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 равны <code>true</code>; проверены order, environment, unit reconciliation, flag, criterion, unit meaning, packet, bad aggregate и отсутствие external work |
|
||||
| <code>xmllint --noout</code> | PASS, три SVG — корректный XML |
|
||||
| SVG safety scan | PASS: совпадений нет; <code>rg</code> завершился с 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 не затронуты |
|
||||
|
||||
<code>npm run audit:draft</code> завершилась с code 0. npm вывел старые
|
||||
предупреждения о пользовательских <code>store-dir</code>, <code>cache-dir</code>
|
||||
и <code>public-hoist-pattern</code>; они не относятся к П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 <code>v0.35.0</code> —
|
||||
17 ноября 2021 года. Его lightweight-тег разрешается в commit
|
||||
<code>1c44b2d0ecc16cbe788e773a1db019b6cbdad725</code>, который использован
|
||||
в ссылке на <code>samples/thresholds.js</code>. Source действительно
|
||||
связывает threshold с именованной метрикой; статья делает из этого только
|
||||
ограниченный редакционный вывод, а не копирует API инструмента.
|
||||
- Тег OpenTelemetry Specification <code>v1.0.0</code> разрешается в commit
|
||||
<code>f228a83e652e5cd3ba96b9f780b704ee7a7daa4c</code>. Его Metrics API
|
||||
помечен <code>Experimental</code> и определяет instrument как средство
|
||||
захвата raw measurements. Ссылки поэтому исторически фиксированы, а
|
||||
evidence packet в статьях остаётся локальным object, не telemetry export.
|
||||
- Повторный <code>node --check</code> прошёл. 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
|
||||
не содержит <code>date</code> и <code>author</code>.
|
||||
|
||||
### 2. Редактура и голос
|
||||
|
||||
- Все три текста перечитаны после независимой source-проверки. Они не
|
||||
подменяют workload абстрактным total, не выдают synthetic rejection за HTTP
|
||||
error и не выносят verdict о capacity. Каждый оставляет конкретный следующий
|
||||
шаг: описать разрешённый реальный запуск отдельно с версией, окружением,
|
||||
входом и raw evidence.
|
||||
- Тон соответствует ноябрю 2021: автор уже видит границы сценария, данных,
|
||||
окружения и наблюдения, но не изображает опыт владельца production
|
||||
platform. Термины привязаны к полям fixture и таблицам; выводы условны и
|
||||
обратимы.
|
||||
|
||||
### 3. Визуал и выпуск
|
||||
|
||||
- Три SVG повторно прошли <code>xmllint --noout</code>; safety scan не нашёл
|
||||
<code>script</code>, <code>foreignObject</code>, внешних URL или
|
||||
<code>data:image</code>. Каждый файл отрендерен Sharp в ширину 375 px и
|
||||
просмотрен вручную: профиль, evidence route и diagnostic cards остаются
|
||||
читаемыми без overlap и horizontal clipping.
|
||||
- <code>npm run build</code> завершилась с code 0 и сгенерировала 374
|
||||
статические страницы. <code>git diff --check</code> также прошёл. Обычные
|
||||
предупреждения npm о пользовательских <code>store-dir</code>,
|
||||
<code>cache-dir</code> и <code>public-hoist-pattern</code> не изменялись и
|
||||
не повлияли на результат.
|
||||
|
||||
Итог: ноябрьские статьи заменяют архивные записи через overlay. После этой
|
||||
интеграции строгий аудит проходит **139 из 358**, остаётся **219**.
|
||||
Reference in New Issue
Block a user