revise February 2022 performance budget articles
Build and deploy / deploy (push) Successful in 14s

This commit is contained in:
2026-07-31 13:31:37 +03:00
parent f7f88fb2a5
commit a4b475a308
7 changed files with 1148 additions and 1 deletions
+231
View File
@@ -0,0 +1,231 @@
# Автономное тройное ревью П48 · февраль 2022 · «Бюджет производительности пути»
Статус: **готово к независимой интеграционной приёмке**. Это только sidecar
author package: registry, README, <code>articles.json</code>, общие audit
scripts, редакционные правила, очередь и чужие файлы не менялись. Git add,
commit и push не выполнялись.
Созданы ровно пять разрешённых файлов:
1. <code>web/scripts/upgrade-2022-02.mjs</code>;
2. <code>editorial/reviews/2022-02-draft.md</code>;
3. <code>web/public/assets/editorial/2022/performance-budget-allocation-2022.svg</code>;
4. <code>web/public/assets/editorial/2022/performance-budget-trend-2022.svg</code>;
5. <code>web/public/assets/editorial/2022/performance-budget-diagnosis-2022.svg</code>.
Revision-модуль экспортирует ровно три overlay revision для stable slug:
- <code>editorial-2022-02-practice-performance-budget</code>;
- <code>editorial-2022-02-mechanism-performance-budget</code>;
- <code>editorial-2022-02-field-performance-budget</code>.
В export есть только поля <code>slug</code>, <code>title</code>,
<code>categories</code>, <code>cover</code>, <code>excerpt</code>,
<code>readingMinutes</code> и <code>contentHtml</code>. Полей
<code>date</code> и <code>author</code> нет: их сохраняет базовый архив.
<code>--print-revisions</code> печатает тот же 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: девять или больше смысловых <code>h2</code>, accessible
table с <code>caption</code>/<code>thead</code>, свой figure с точным
<code>alt</code>/<code>figcaption</code>, несколько согласованных
JavaScript examples, нумерованный маршрут и раздел
«Проверяемые источники» с тремя official URLs.
- Голос соответствует М5 / февралю 2022: текст начинает с конкретного
пользовательского пути, говорит коротко «симптом → причина → проверка →
действие», а архитектурный вывод появляется только после описанного
наблюдения. Нигде не приписывается существующая production-команда, CI,
Chrome trace, LCP, real-user metric или SLA.
- В первой ручной вычитке draft gate обнаружил, что у практической статьи
формальное слово «проблема» находилось позже первых 800 знаков. Первый
абзац переписан как «Проблема начинается…»; повторный audit прошёл.
Вердикт прохода: **пройден**. Тексты не растягивают один вывод: каждый
переходит от contract к snapshot, compare, ограниченной диагностике и
проверке следующего изменения.
## Проход 2. Fixture и техническая согласованность — пройдено
<code>createTeachingBudget()</code> и
<code>runPerformanceBudgetFixture()</code> работают только с frozen plain
objects и arrays в памяти. Условный navigation workload имеет route
<code>/training/checkout/review</code>, scenario
<code>anonymous-cart-with-one-item</code> и четыре собственных поля:
<code>documentTicks</code>, <code>styleTicks</code>,
<code>scriptTicks</code>, <code>renderTicks</code>.
Это **не** названия Web Vitals и не browser fields. Unit
<code>teaching-ticks</code>, а browser observation, CI observation и trace
явно имеют <code>not-collected</code>; сеть, CPU и cache —
<code>not-modelled</code>. Fixture не вызывает browser, Lighthouse, Chrome,
Performance API, PerformanceObserver, HTTP, сеть, таймер, file system или CI.
| Объект | Значения и правило | Результат модели | Честная граница |
| --- | --- | --- | --- |
| Baseline | 24 / 15 / 26 / 20; каждый component не больше limit + tolerance | overall PASS, total 85 | не измеренный маршрут |
| Candidate | меняется только <code>scriptTicks</code>: 26 → 34 | component FAIL: 34 больше allowed 30 | не установленная причина изменения |
| Aggregate | candidate total 93; allowed 95 + 3 = 98 | aggregate PASS | не имеет права отменить named FAIL |
| Conditions mismatch | меняется только учебное cache condition | <code>measurement-contract-invalid</code>, aggregate <code>not-comparable</code> | не regression verdict |
| Diagnosis | failed name — <code>scriptTicks</code> | <code>inspect-script-input-and-one-route-boundary</code> | не global performance claim |
Проверены **15/15 assertions**:
1. baseline проходит каждый named budget;
2. candidate падает по именованному <code>scriptTicks</code>;
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 ограничена <code>scriptTicks</code>;
11. diagnosis ведёт к focused action, а не global conclusion;
12. учебная арифметика totals согласована;
13. неизвестное или отрицательное поле не проходит validation;
14. fixture не выполняет external observation;
15. повторное сравнение детерминировано.
Проверены по два code fragments в каждом тексте: practice читает
<code>baselineComparison</code>/<code>candidateComparison</code> и guard для
first failure; mechanism создаёт baseline/candidate и отдельный condition
mismatch; field читает <code>diagnosis</code>/<code>measurementConditions</code>
и повторно проверяет границу 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 | существование <code>PerformanceNavigationTiming</code> и 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 проверку:
- <code>performance-budget-allocation-2022.svg</code> показывает четыре
named checks, explicit limit+tolerance, aggregate PASS и overall FAIL в
одной вертикальной композиции;
- <code>performance-budget-trend-2022.svg</code> сравнивает baseline и
candidate для total и <code>scriptTicks</code>, не называя ticks
browser result;
- <code>performance-budget-diagnosis-2022.svg</code> показывает stop при
condition mismatch, порядок component → aggregate и focused action.
У каждого SVG есть <code>title</code>, <code>desc</code>,
<code>role="img"</code>, контрастные labels и viewBox для узкого экрана.
В XML нет <code>script</code>, <code>foreignObject</code>, external
<code>href</code>/<code>src</code> и raster data URI.
### Фактически выполненные проверки
Команды выполнены из <code>web/</code>:
<pre><code>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 '&lt;script|&lt;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}) =&gt; { ... resize({width:375}) ... })"</code></pre>
| Проверка | Фактический результат |
| --- | --- |
| <code>node --check</code> | 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** |
| <code>xmllint --noout</code> | PASS, все три SVG — корректный XML |
| SVG safety scan | PASS: совпадений нет; <code>rg</code> завершился с 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 не затронуты |
<code>npm run audit:draft</code> завершилась с code 0. npm вывел уже
существующие предупреждения о <code>store-dir</code>, <code>cache-dir</code>
и <code>public-hoist-pattern</code>; они не относятся к П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; поля
<code>documentTicks</code>, <code>styleTicks</code>,
<code>scriptTicks</code> и <code>renderTicks</code> явно остаются
проектными teaching units.
- Независимый import fixture подтвердил 15 из 15 assertions. Baseline имеет
total 85 и проходит; candidate поднимает только <code>scriptTicks</code>
с 26 до 34. Его aggregate 93 остаётся внутри allowed 98, но overall верно
остаётся FAIL из-за component limit 30. Изменение declared conditions
возвращает <code>measurement-contract-invalid</code>, а не verdict о
регрессии. Это проверяет именно контрпример «зелёный total скрывает красную
часть».
- <code>node --check</code> и draft audit прошли: body — 9 995, 9 989 и
9 949 знаков. После подключения strict audit подтвердил 1 figure, 1 table
и 2 code examples в каждой статье. В registry 139 revisions; есть ровно
три февральских slug без duplicate и без полей <code>date</code>/<code>author</code>
в 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: нет <code>script</code>,
<code>foreignObject</code>, external URL или raster data. Sharp renders на
ширине 375 px просмотрены вручную: named checks, aggregate/overall split и
diagnostic stop condition читаемы без clipping/overlap.
- <code>npm run build</code> завершилась с code 0 и сгенерировала 374
статические страницы; <code>git diff --check</code> прошёл. Старые npm
warnings о пользовательских <code>store-dir</code>, <code>cache-dir</code>
и <code>public-hoist-pattern</code> не относятся к пакету.
Итог: февральские статьи заменяют архивные записи через overlay. После этой
интеграции строгий аудит проходит **148 из 358**, остаётся **210**.