Files
huncode a4b475a308
Build and deploy / deploy (push) Successful in 14s
revise February 2022 performance budget articles
2026-07-31 13:31:37 +03:00

18 KiB
Raw Permalink Blame History

Автономное тройное ревью П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 опубликован до всех дат февраля 2022 существование PerformanceNavigationTiming и navigation timing information что fixture fields являются platform timing fields
W3C User Timing Level 3, 13 Sep 2021 существовал до февраля 2022 исторические mark/measure и metadata terminology что package записывает mark, measure или browser timestamp
W3C Performance Timeline Level 2, 19 Aug 2021 существовал до февраля 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.