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

232 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Автономное тройное ревью П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**.