rewrite 2026-09 and 2027 articles for reader-facing quality
Build and deploy / deploy (push) Successful in 18s

This commit is contained in:
2026-07-31 22:26:56 +03:00
parent 3bfc3f21c4
commit 440c8721dc
69 changed files with 4424 additions and 3533 deletions
+38 -88
View File
@@ -1,103 +1,53 @@
# P112 — June 2027: «Большой разбор производительности»
# Июнь 2027 — техническая вычитка производительности
## Статус, temporal boundary и file scope
Тройка отвечает на разные вопросы: где начинается критический путь, какой ресурс действительно блокирует страницу и как повторить замер.
Редакторская дата: **2026-07-31**. Июнь 2027 ещё не наступил. Три revision — только **plan/scenario на 2027-06** с source cutoff **2026-07-31**. В них не существуют и не заявляются benchmark, telemetry, profile, bottleneck, rollout, winner, product/production effect, service data или raw telemetry.
| Статья | Body без источников | Практический результат |
| --- | ---: | --- |
| <code>editorial-2027-06-practice-performance-capstone</code> | 5 632 | локальный сервер fast/slow и разделение TTFB/HTML |
| <code>editorial-2027-06-mechanism-performance-capstone</code> | 5 275 | чтение Resource Timing по инициатору и потребителю |
| <code>editorial-2027-06-field-performance-capstone</code> | 5 452 | локальная серия из 20 замеров, median и p95 |
Модуль принимает лишь named fixed in-memory literals. Единственный положительный status — `synthetic-plan-hand-off`, всегда с `productionEffect: not-attempted`; прочие cases проходят fail-closed. Код не читает files, network, environment, clock, secrets, telemetry, browsers, services, systems или data и не делает наблюдений. Реальный сбор, profile, service inspection или интерпретация могут появиться только в отдельном явно authorised scope.
## Проход 1 — факты, пример и источники
Изменены только разрешённые P112-файлы:
| Статья | До | После | Причина |
| --- | --- | --- | --- |
| Practice | Общая задержка страницы могла смешивать TTFB и визуальную готовность. | Добавлено различие TTFB, DOMContentLoaded, FCP и LCP; локальный сервер измеряет только HTTP-участок. | Не выдавать серверный замер за пользовательскую метрику. |
| Mechanism | Длинная полоса waterfall трактовалась как причина. | Добавлены <code>initiatorType</code>, потребитель ресурса и правило для отсутствующего <code>renderBlockingStatus</code>. | Время ресурса не доказывает, что экран его ждал. |
| Field | Среднее и p95 описывались без разделения режимов кэша. | Добавлена проверка cold/warm cache и сохранение сырых значений вместе с размером выборки. | Сделать сравнение условий воспроизводимым. |
- `web/scripts/upgrade-2027-06.mjs`
- `editorial/reviews/2027-06-draft.md`
- `web/public/assets/editorial/2027/performance-capstone-2027-critical-path-contract.svg`
- `web/public/assets/editorial/2027/performance-capstone-2027-evidence-boundary-matrix.svg`
- `web/public/assets/editorial/2027/performance-capstone-2027-handoff-loop.svg`
Проверены первичные источники:
Git не использовался. Registry, README, queue, `articles.json`, app и P102–P111 не менялись.
1. [W3C Navigation Timing Level 2](https://www.w3.org/TR/2026/WD-navigation-timing-2-20260225/), Working Draft, 25 February 2026. Использован для временных меток навигации. Граница: draft не задаёт пороги качества и не сообщает значения конкретного браузера.
2. [W3C Performance Timeline](https://www.w3.org/TR/2025/CRD-performance-timeline-20250521/), Candidate Recommendation Draft, 21 May 2025. Использован для <code>PerformanceEntry</code> и <code>PerformanceObserver</code>. Граница: документ не гарантирует одинаковую поддержку entry во всех движках.
3. [W3C Resource Timing](https://www.w3.org/TR/2026/CRD-resource-timing-20260420/), Candidate Recommendation Draft, 20 April 2026. Использован для времени и размеров ресурсов. Граница: кросс-доменные поля зависят от политики браузера и заголовков.
## Закреплённые первичные источники и URL verification
Все три датированные страницы отвечают HTTP 200. Черновой статус W3C назван в источнике и не превращён в факт о приложении.
1. [W3C Performance Timeline Level 2](https://www.w3.org/TR/2019/WD-performance-timeline-2-20190329/) — W3C Working Draft, **dated snapshot 2019-03-29**. Это immutable датированная замена прежнему mutable URL. Используется для vocabulary `PerformanceEntry`/`PerformanceObserver`; не подтверждает существование entry, rendering path или effect в неизвестном приложении.
2. [W3C Navigation Timing Level 2](https://www.w3.org/TR/2026/WD-navigation-timing-2-20260225/) — W3C Working Draft, **2026-02-25**. Используется для границ navigation timing entry; не создаёт future measurement или baseline.
3. [W3C Resource Timing](https://www.w3.org/TR/2026/CRD-resource-timing-20260420/) — W3C Candidate Recommendation Draft, **2026-04-20**. Используется для vocabulary resource entries и `Timing-Allow-Origin`; не делает условия сопоставимыми и не устанавливает bottleneck.
4. [W3C Long Tasks API](https://www.w3.org/TR/2026/WD-longtasks-1-20260319/) — W3C Working Draft, **2026-03-19**. Используется для определения класса long task; не доказывает profile, причину задержки или наличие long task в продукте.
## Проход 2 — структура, голос и плотность
Все четыре exact W3C URL проверены 2026-07-31 запросом `curl -I -L`: HTTP **200**. Их датированные publication/last-modified значения — 2019-03-29, 2026-02-25, 2026-04-20 и 2026-03-19; каждое не позже source cutoff. Предыдущая mutable-публикация удалена из script и review: историческим доказательством остаётся только закреплённый W3C snapshot. Спецификация задаёт термин и visibility boundary, но никогда не выступает evidence измеренного результата.
| Статья | До | После | Причина |
| --- | --- | --- | --- |
| Practice | Текст мог читаться как список метрик. | В начале оставлен один вопрос — «какой участок задерживает экран» — и для каждого действия добавлена цена. | Сохранить техлидский компромисс вместо каталога терминов. |
| Mechanism | Waterfall, CSS и script были смешаны в одном объяснении. | Добавлены отдельные блоки про initiator, порядок <code>defer/async</code>, размер и зависимость. | Читатель видит механизм до рецепта. |
| Field | p95 появлялся раньше описания условий. | Протокол перенесён перед кодом: URL, commit, browser, cache, повторы, метрика. | Число получает вход и единицу измерения. |
## Additional independent correction after rejection
Прагматичная речь проверена по формуле «симптом → измерение → изменение → ограничение». Общие оценки удалены; в тексте остались измеряемые участки, условия и ожидаемый результат.
Независимая приёмка справедливо отклонила предыдущую глубину **5 913 / 6 306 / 6 203** знака: общий минимум выполнялся, но это не соответствовало очереди «Большой разбор производительности». Исправление расширило статьи до строгого локального диапазона **9 000–12 000** знаков и закрепило тот же диапазон в `revision()` и `verifyRevisionsAgainstFixture()`.
## Проход 3 — визуал, доступность и повторы
- **Practice** теперь отдельно разбирает navigation/resource/main-thread/action boundary, единицу работы, owner каждого элемента контракта, ложный proxy-контрпример и редакционный stop для склеенной постановки.
- **Mechanism** добавляет condition ledger, смысл baseline без прошлого числа, confounders, TAO/visibility/privacy boundary, различие между числом и causal claim, а также будущие outcomes фальсификации без выдачи их за result.
- **Field** добавляет evidence record против отчёта, разделение прав на сбор и решение, no-data hand-off, независимость review от decision и минимальный контракт следующего scope.
| Статья | До | После | Причина |
| --- | --- | --- | --- |
| Practice | Схема не отделяла сервер от блокирующих ресурсов. | SVG стал временной линией TTFB → HTML → CSS/JS → Paint; alt повторяет эту границу. | Рисунок поддерживает ключевое различие статьи. |
| Mechanism | Визуал не показывал потребителя ресурса. | SVG-матрица получила колонки «ресурс, инициатор, время, ждёт, действие». | Сократить визуальное чтение waterfall до проверяемых полей. |
| Field | Цикл замера не показывал p95 и изменение одного фактора. | SVG показывает условия, повторы, p95 и возврат к одному фактору; подпись предупреждает о raw distribution. | Не сводить измерение к одной цифре. |
Новые body lengths без sources: practice — **11 758**, mechanism — **11 981**, field — **11 747** знаков. Все новые разделы описывают контракт будущей работы, а не будущий benchmark, telemetry, profile или производственный эффект.
<code>xmllint --noout</code> и SVG safety scan прошли для трёх файлов. Sharp отрендерил <code>375×240</code>, <code>375×250</code>, <code>375×250</code>; подписи, таблицы и карточки читаются без горизонтального скролла. Все изображения имеют русские <code>title</code>, <code>desc</code>, HTML <code>alt</code> и <code>figcaption</code>.
## Review pass 1 — содержание, источники и temporal honesty
## Итоговые проверки
- Первые два абзаца каждой статьи по-прежнему называют исходную проблему и цену: спорные правки, ложный winner и преждевременный rollout соответственно.
- Три текста сохраняют разные главные вопросы: practice — что является единицей критического пути; mechanism — что сделает сравнение опровержимым; field — как передать вопрос без отчёта.
- Ссылки отделены от фактов: датированные W3C snapshots объясняют API и ограничения, но не подтверждают route, service, response, entry, timing или пользовательское состояние.
- В каждом revision есть HTML table, исходная русская SVG-схема с meaningful alt/caption, safe runnable example, ordered actions, limits и concrete next scope boundary.
## Review pass 2 — literal safety и fail-closed
- `critical-path-contract-2027-06-v1` — единственный accept: `synthetic-plan-hand-off` / `productionEffect: not-attempted`.
- `missing-june-date-or-cutoff-v1` — `stop-missing-june-date-or-cutoff`; date и cutoff не выводятся по умолчанию.
- `unnamed-path-contract-v1` — `stop-unnamed-path-contract`; question обязана иметь id и revision.
- `conditions-claimed-without-record-v1` — `stop-conditions-claimed-without-record`; browser/device/cache/route нельзя assumed.
- `observation-injected-into-plan-v1` — `stop-observation-injected-into-plan`; benchmark, telemetry и profile остаются unobserved.
- `result-substitution-v1` — `stop-result-substitution`; winner, bottleneck, rollout и production conclusion запрещены.
- JSON clone + recursive deep freeze закрывают mutation nested contract/conditions/evidence. Unknown input закрывается `stop-unknown-fixed-literal`. Runnable examples выполняют только fixed literal/evaluator и не имеют I/O.
## Review pass 3 — visual, mobile, SVG safety и uniqueness
- Все SVG имеют русский `title`/`desc`; article figures имеют русские alt/caption. Не найдены external URL, `script`, `foreignObject`, `javascript:`, `data:image` или inline event handlers.
- Sharp создал три изображения **375×225**. Ручной осмотр: contract сохраняет четыре границы и итоговый hand-off; matrix — четыре строки/колонки и stop rule; loop — вход, проверки, stop-ветку и владельца. Обрезаний или перекрытий нет.
- Strict scan исключал section `Проверяемые источники`, но включал `<p>` и `<pre>`, поэтому runnable code участвовал. Сканированы 3 P112 revision попарно и против **30** published revision P102–P111 (2026-08…2027-05). `exactParagraphs160: 0`, `common12WordFragments: 0`, `failures: []`.
## Реально выполненные проверки после correction
Из `web/` выполнены:
```sh
node --check scripts/upgrade-2027-06.mjs
node scripts/upgrade-2027-06.mjs --verify-fixture
npm run audit:draft -- scripts/upgrade-2027-06.mjs
xmllint --noout public/assets/editorial/2027/performance-capstone-2027-critical-path-contract.svg public/assets/editorial/2027/performance-capstone-2027-evidence-boundary-matrix.svg public/assets/editorial/2027/performance-capstone-2027-handoff-loop.svg
rg -n -i '<(script|foreignObject)\b|javascript:|data:image|(?:^|[[:space:]])on[a-z]+=' public/assets/editorial/2027/performance-capstone-2027-critical-path-contract.svg public/assets/editorial/2027/performance-capstone-2027-evidence-boundary-matrix.svg public/assets/editorial/2027/performance-capstone-2027-handoff-loop.svg
node --input-type=module -e "import sharp from 'sharp'; /* render all three SVG at width 375 */"
node --input-type=module -e "/* import P102-P111 and P112; exclude sources; scan p/pre and 12-word grams */"
curl -I -L https://www.w3.org/TR/2019/WD-performance-timeline-2-20190329/
curl -I -L https://www.w3.org/TR/2026/WD-navigation-timing-2-20260225/
curl -I -L https://www.w3.org/TR/2026/CRD-resource-timing-20260420/
curl -I -L https://www.w3.org/TR/2026/WD-longtasks-1-20260319/
```
Фактические результаты: syntax — pass; fixture — **9/9** (6 literal statuses + 3 articles); internal 9–12k guard — pass; audit — pass для three exact slug с **11 758 / 11 981 / 11 747** body chars; XML — pass; SVG safety scan — empty/pass; Sharp — **3 × 375×225**; manual mobile review — pass; duplicate scan — `scannedP112: 3`, `againstP102toP111: 30`, `failures: []`; W3C URL verification — **4 × HTTP 200**.
## Disposition
P112 остаётся завершённым плановым выпуском: итогом может быть лишь `synthetic-plan-hand-off`. Любая будущая работа с реальными target, data, telemetry, profile, benchmark, interpretation, rollout или effect требует собственного authorised scope и не может быть задним числом добавлена в этот выпуск.
## Независимая приёмка — 2026-07-31
### Проход 1 — глубина, источники и границы знания
- Предыдущая краткая версия была отклонена и расширена до 11 758, 11 981 и 11 747 знаков. Новые разделы раскрывают ownership, false proxy, condition ledger, confounders, visibility/TAO, privacy, provenance и separation review/decision, не добавляя вымышленного performance-result.
- Все источники W3C проверены: immutable snapshot Performance Timeline от 2019-03-29 и три датированных W3C публикации 2026 года существуют до cutoff 2026-07-31. Они применены как vocabulary и спецификация visibility, не как evidence о продукте.
- Practice, mechanism и field сохраняют разные вопросы и цену: договор критического пути, опровержимость claim и передача вопроса без отчёта.
### Проход 2 — контракт и редакционный автоматический аудит
- `node --check`, fixture `9/9`, export/deep-freeze check и `npm run audit:draft -- scripts/upgrade-2027-06.mjs` прошли. Единственная accepted ветвь — `synthetic-plan-hand-off`; все пять контрпримеров останавливаются fail-closed, accepted effect — `not-attempted`.
- Три body проходят не только глобальный диапазон 5–15k, но и локальную защиту capstone `9–12k`.
- `xmllint` прошёл без output; SVG safety scan не нашёл executable или active external content.
### Проход 3 — визуал, overlap и выпуск
- Три SVG заново отрендерены и просмотрены на ширине 375 px: контур критического пути, матрица сравнимости и hand-off loop остаются читаемыми без обрезания.
- Strict cross-package scan P102–P112 исключает source section, но включает code. Для 33 статей результат: `collisions: []`.
- В реестр добавлены только три июньские revisions; пользовательские app/data files не включены.
- <code>node --check scripts/upgrade-2027-06.mjs</code> — PASS.
- <code>node scripts/upgrade-2027-06.mjs --verify-fixture</code> — PASS, <code>7/7</code>.
- <code>npm run audit:draft -- scripts/upgrade-2027-06.mjs</code> — PASS, 3/3 exact slugs.
- Три извлечённых примера запущены локально: серверный замер, browser timing snippet в Node-совместимой среде и p95 — <code>3/3</code>.
- Сквозное сравнение 349 материалов, 4 176 сравнений, sources исключены, code включён; совпадений — <code>0</code>.