232 lines
18 KiB
Markdown
232 lines
18 KiB
Markdown
# Автономное тройное ревью П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 '<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}) ... })"</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**.
|