# Автономное тройное ревью П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**.