# Автономное тройное ревью П48 · февраль 2022 · «Бюджет производительности пути»
Статус: **готово к независимой интеграционной приёмке**. Это только sidecar
author package: registry, README, articles.json, общие audit
scripts, редакционные правила, очередь и чужие файлы не менялись. Git add,
commit и push не выполнялись.
Созданы ровно пять разрешённых файлов:
1. web/scripts/upgrade-2022-02.mjs;
2. editorial/reviews/2022-02-draft.md;
3. web/public/assets/editorial/2022/performance-budget-allocation-2022.svg;
4. web/public/assets/editorial/2022/performance-budget-trend-2022.svg;
5. web/public/assets/editorial/2022/performance-budget-diagnosis-2022.svg.
Revision-модуль экспортирует ровно три overlay revision для stable slug:
- editorial-2022-02-practice-performance-budget;
- editorial-2022-02-mechanism-performance-budget;
- editorial-2022-02-field-performance-budget.
В export есть только поля slug, title,
categories, cover, excerpt,
readingMinutes и contentHtml. Полей
date и author нет: их сохраняет базовый архив.
--print-revisions печатает тот же JSON, что и import-safe export;
draft gate проверил это сравнением.
## Проход 1. Голос, структура и объём — пройдено
| Revision | Проблема и цена в первых двух абзацах | Главный вопрос | Body |
| --- | --- | --- | ---: |
| Практика | На пути оформления маленькие изменения проходят общий PASS, а часть пути постепенно съедает запас; цена — зелёный сигнал без владельца изменения | Как зафиксировать route, conditions, allocation и named component rule до сравнения candidate | **9 995** |
| Механизм | Total PASS принимают за доказательство здоровья пути; цена — budget превращается в таблицу, которая не запрещает частную регрессию | Почему contract, snapshot, component checks, aggregate и diagnosis имеют разные роли | **9 989** |
| Полевой разбор | Total остаётся зелёным, а один component красный; цена — накопление диагностического долга и широкие правки по одной строке | Как остановить несопоставимое сравнение и сузить следующий факт до одного component и одной boundary | **9 949** |
- Все тексты находятся в требуемом П48 коридоре **7–10 тыс.** и обязательном
диапазоне 5–15 тыс. знаков body.
- В каждом revision: девять или больше смысловых h2, accessible
table с caption/thead, свой figure с точным
alt/figcaption, несколько согласованных
JavaScript examples, нумерованный маршрут и раздел
«Проверяемые источники» с тремя official URLs.
- Голос соответствует М5 / февралю 2022: текст начинает с конкретного
пользовательского пути, говорит коротко «симптом → причина → проверка →
действие», а архитектурный вывод появляется только после описанного
наблюдения. Нигде не приписывается существующая production-команда, CI,
Chrome trace, LCP, real-user metric или SLA.
- В первой ручной вычитке draft gate обнаружил, что у практической статьи
формальное слово «проблема» находилось позже первых 800 знаков. Первый
абзац переписан как «Проблема начинается…»; повторный audit прошёл.
Вердикт прохода: **пройден**. Тексты не растягивают один вывод: каждый
переходит от contract к snapshot, compare, ограниченной диагностике и
проверке следующего изменения.
## Проход 2. Fixture и техническая согласованность — пройдено
createTeachingBudget() и
runPerformanceBudgetFixture() работают только с frozen plain
objects и arrays в памяти. Условный navigation workload имеет route
/training/checkout/review, scenario
anonymous-cart-with-one-item и четыре собственных поля:
documentTicks, styleTicks,
scriptTicks, renderTicks.
Это **не** названия Web Vitals и не browser fields. Unit
teaching-ticks, а browser observation, CI observation и trace
явно имеют not-collected; сеть, CPU и cache —
not-modelled. Fixture не вызывает browser, Lighthouse, Chrome,
Performance API, PerformanceObserver, HTTP, сеть, таймер, file system или CI.
| Объект | Значения и правило | Результат модели | Честная граница |
| --- | --- | --- | --- |
| Baseline | 24 / 15 / 26 / 20; каждый component не больше limit + tolerance | overall PASS, total 85 | не измеренный маршрут |
| Candidate | меняется только scriptTicks: 26 → 34 | component FAIL: 34 больше allowed 30 | не установленная причина изменения |
| Aggregate | candidate total 93; allowed 95 + 3 = 98 | aggregate PASS | не имеет права отменить named FAIL |
| Conditions mismatch | меняется только учебное cache condition | measurement-contract-invalid, aggregate not-comparable | не regression verdict |
| Diagnosis | failed name — scriptTicks | inspect-script-input-and-one-route-boundary | не global performance claim |
Проверены **15/15 assertions**:
1. baseline проходит каждый named budget;
2. candidate падает по именованному scriptTicks;
3. overall становится FAIL при одном failed component;
4. aggregate PASS не скрывает named failure;
5. component tolerance печатается явно;
6. aggregate tolerance печатается явно;
7. baseline и candidate имеют один declared contract;
8. несовпадение conditions блокирует compare;
9. все четыре components остаются отдельными в output;
10. diagnosis ограничена scriptTicks;
11. diagnosis ведёт к focused action, а не global conclusion;
12. учебная арифметика totals согласована;
13. неизвестное или отрицательное поле не проходит validation;
14. fixture не выполняет external observation;
15. повторное сравнение детерминировано.
Проверены по два code fragments в каждом тексте: practice читает
baselineComparison/candidateComparison и guard для
first failure; mechanism создаёт baseline/candidate и отдельный condition
mismatch; field читает diagnosis/measurementConditions
и повторно проверяет границу scope. Ни один snippet не обращается к
несуществующему export или полю.
Вердикт прохода: **пройден**. Модель доказывает только собственный контракт:
component rule сильнее aggregate, tolerance и conditions видимы, а failure
создаёт ограниченную следующую проверку. Она не вычисляет реальную скорость.
## Проход 3. Исторические источники и визуал — пройдено
| Источник | Историческая рамка | Что разрешено использовать | Что текст не утверждает |
| --- | --- | --- | --- |
| [W3C Navigation Timing Level 2, 17 Jan 2022](https://www.w3.org/TR/2022/WD-navigation-timing-2-20220117/) | опубликован до всех дат февраля 2022 | существование PerformanceNavigationTiming и navigation timing information | что fixture fields являются platform timing fields |
| [W3C User Timing Level 3, 13 Sep 2021](https://www.w3.org/TR/2021/WD-user-timing-3-20210913/) | существовал до февраля 2022 | исторические mark/measure и metadata terminology | что package записывает mark, measure или browser timestamp |
| [W3C Performance Timeline Level 2, 19 Aug 2021](https://www.w3.org/TR/2021/WD-performance-timeline-2-20210819/) | существовал до февраля 2022 | historical meaning of performance entries and retrieval | что CI PASS, budget allocation или ticks определены W3C |
Все три источника — датированные W3C working drafts; в текстах это прямо
названо. Использованы только как историческая рамка официальных platform
interfaces. В пакете нет поздних interaction metrics, future INP, current-only
Lighthouse recommendations или придуманной метрики Chrome/пользователя.
SVG прошли mobile-first проверку:
- performance-budget-allocation-2022.svg показывает четыре
named checks, explicit limit+tolerance, aggregate PASS и overall FAIL в
одной вертикальной композиции;
- performance-budget-trend-2022.svg сравнивает baseline и
candidate для total и scriptTicks, не называя ticks
browser result;
- performance-budget-diagnosis-2022.svg показывает stop при
condition mismatch, порядок component → aggregate и focused action.
У каждого SVG есть title, desc,
role="img", контрастные labels и viewBox для узкого экрана.
В XML нет script, foreignObject, external
href/src и raster data URI.
### Фактически выполненные проверки
Команды выполнены из web/:
node --check scripts/upgrade-2022-02.mjs
npm run audit:draft -- scripts/upgrade-2022-02.mjs
node scripts/upgrade-2022-02.mjs --verify-fixture
xmllint --noout \
public/assets/editorial/2022/performance-budget-allocation-2022.svg \
public/assets/editorial/2022/performance-budget-trend-2022.svg \
public/assets/editorial/2022/performance-budget-diagnosis-2022.svg
rg -n -i '<script|<foreignObject|(?:href|src)="(?:https?:|data:)|xlink:href=' \
public/assets/editorial/2022/performance-budget-allocation-2022.svg \
public/assets/editorial/2022/performance-budget-trend-2022.svg \
public/assets/editorial/2022/performance-budget-diagnosis-2022.svg
node -e "import('sharp').then(async ({default: sharp}) => { ... resize({width:375}) ... })"
| Проверка | Фактический результат |
| --- | --- |
| node --check | PASS, code 0 |
| Draft gate, финальный запуск | PASS: **9 995 / 9 989 / 9 949** body chars; проверены archive slugs, overlay shape без date/author, sections, tables, figures, code, ordered routes, sources, local assets и import/CLI equality |
| In-memory fixture | PASS: **15/15 assertions** |
| xmllint --noout | PASS, все три SVG — корректный XML |
| SVG safety scan | PASS: совпадений нет; rg завершился с code 1, что для поиска означает ожидаемый пустой результат |
| Sharp 375 px | PASS: все три SVG отрендерены в PNG и вручную просмотрены; headings, cards, arrows, labels и нижние ограничения читаемы, clipping/overlap/horizontal overflow не обнаружены |
| Scope/self-review | PASS: созданы только пять разрешённых P48 файлов; shared registry, README, base archive, queue, Git и чужие mascot PNG не затронуты |
npm run audit:draft завершилась с code 0. npm вывел уже
существующие предупреждения о store-dir, cache-dir
и public-hoist-pattern; они не относятся к П48 и не менялись.
Не запускались strict audit после registry integration, production build,
browser or screen-reader test, Lighthouse, Chrome, реальный CI job, network
workload, trace, RUM, commit или публикация. Визуальная проверка относится к
локальному Sharp render 375 px, а не к фактическому browser layout. Это
намеренные ограничения автономной партии.
## Итог
Три прохода завершены. Один дефект формальной постановки проблемы найден и
исправлен до финального audit. П48 готова к независимой приёмке: следующие
шаги интегратора — отдельно проверить фактический mapping реального проекта,
подключить overlay и только затем запускать strict audit/build/publish.
## Независимое редакторское ревью и интеграция
Статус: **принято и подключено в editorial overlay 31 июля 2026 года**.
### 1. Факты и техника
- Источники закреплены на датированных W3C Working Draft: Navigation Timing
Level 2 от 17 января 2022, User Timing Level 3 от 13 сентября 2021 и
Performance Timeline Level 2 от 19 августа 2021. Они поддерживают только
исторический словарь platform timing interfaces; поля
documentTicks, styleTicks,
scriptTicks и renderTicks явно остаются
проектными teaching units.
- Независимый import fixture подтвердил 15 из 15 assertions. Baseline имеет
total 85 и проходит; candidate поднимает только scriptTicks
с 26 до 34. Его aggregate 93 остаётся внутри allowed 98, но overall верно
остаётся FAIL из-за component limit 30. Изменение declared conditions
возвращает measurement-contract-invalid, а не verdict о
регрессии. Это проверяет именно контрпример «зелёный total скрывает красную
часть».
- node --check и draft audit прошли: body — 9 995, 9 989 и
9 949 знаков. После подключения strict audit подтвердил 1 figure, 1 table
и 2 code examples в каждой статье. В registry 139 revisions; есть ровно
три февральских slug без duplicate и без полей date/author
в overlay.
### 2. Редактура и голос
- Тексты перечитаны как материалы 2022 года: они уже говорят о контракте
сравнения и owner компонента, но не присваивают автору CI, Chrome trace,
RUM, Web Vitals или реальную performance regression. Каждая статья
заканчивается локальным следующим действием, а не обещанием ускорения.
- Термины `aggregate`, `component`, `tolerance` и `conditions` раскрыты через
object, таблицу и fixture. Вывод не расширяется от named failure до общей
оценки маршрута, что сохраняет прагматичный тон и границу применимости.
### 3. Визуал и выпуск
- Три SVG повторно прошли XML и safety scan: нет script,
foreignObject, external URL или raster data. Sharp renders на
ширине 375 px просмотрены вручную: named checks, aggregate/overall split и
diagnostic stop condition читаемы без clipping/overlap.
- npm run build завершилась с code 0 и сгенерировала 374
статические страницы; git diff --check прошёл. Старые npm
warnings о пользовательских store-dir, cache-dir
и public-hoist-pattern не относятся к пакету.
Итог: февральские статьи заменяют архивные записи через overlay. После этой
интеграции строгий аудит проходит **148 из 358**, остаётся **210**.