18 KiB
Автономное тройное ревью П48 · февраль 2022 · «Бюджет производительности пути»
Статус: готово к независимой интеграционной приёмке. Это только sidecar
author package: registry, README, articles.json, общие audit
scripts, редакционные правила, очередь и чужие файлы не менялись. Git add,
commit и push не выполнялись.
Созданы ровно пять разрешённых файлов:
web/scripts/upgrade-2022-02.mjs;editorial/reviews/2022-02-draft.md;web/public/assets/editorial/2022/performance-budget-allocation-2022.svg;web/public/assets/editorial/2022/performance-budget-trend-2022.svg;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:
- baseline проходит каждый named budget;
- candidate падает по именованному
scriptTicks; - overall становится FAIL при одном failed component;
- aggregate PASS не скрывает named failure;
- component tolerance печатается явно;
- aggregate tolerance печатается явно;
- baseline и candidate имеют один declared contract;
- несовпадение conditions блокирует compare;
- все четыре components остаются отдельными в output;
- diagnosis ограничена
scriptTicks; - diagnosis ведёт к focused action, а не global conclusion;
- учебная арифметика totals согласована;
- неизвестное или отрицательное поле не проходит validation;
- fixture не выполняет external observation;
- повторное сравнение детерминировано.
Проверены по два 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.