rewrite 2026-09 and 2027 articles for reader-facing quality
Build and deploy / deploy (push) Successful in 18s
Build and deploy / deploy (push) Successful in 18s
This commit is contained in:
@@ -1,64 +1,42 @@
|
||||
# P114 — August 2027: «Большой разбор безопасности»
|
||||
# Август 2027 — техническая вычитка web security
|
||||
|
||||
Редакторская дата: `2026-07-31`. Плановый сценарий: `2027-08`. Source cutoff: `2026-07-31`. Это изолированный draft, а не record о системе, проверке или результате. Во всех трёх материалах единственный positive output — `synthetic-plan-hand-off`; его `productionEffect` всегда `not-attempted`.
|
||||
Пакет состоит из трёх самостоятельных материалов: про проверку security headers, измерение Web Vitals и эксплуатационную карточку с rollback. Исторические slug сохранены. В HTML-телах нет редакционных планов, описания автора, внутренних статусов или отчёта о создании текста.
|
||||
|
||||
## Источники и temporal boundary
|
||||
## Проход 1 — факты, пример и источники
|
||||
|
||||
1. [NIST SP 800-218, Secure Software Development Framework (SSDF) Version 1.1](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-218.pdf), February 2022, immutable dated PDF. Применение: официальный словарь высокоуровневых практик secure development и коммуникации. Граница: не подтверждает существование практики, проверки, уязвимости, результата или контроля в P114.
|
||||
2. [NIST SP 800-53 Revision 5, Security and Privacy Controls for Information Systems and Organizations](https://doi.org/10.6028/NIST.SP.800-53r5), final dated 10 December 2020; DOI ведёт к immutable dated PDF. Применение: различение функции контроля и assurance. Граница: не подтверждает выбор, deployment, работу или покрытие контроля в P114.
|
||||
| Статья | До | После | Правка |
|
||||
|---|---|---|---|
|
||||
| Practice | Карточка решения говорила о «контроле» без конкретного web-объекта. | buildSecurityHeaders возвращает CSP nonce, object-src none, base-uri self и HSTS с явным ограничением первого HTTP-перехода. | Пример проверяет реальные директивы, а не абстрактный статус безопасности. |
|
||||
| Mechanism | Метрики описывались как общий показатель качества страницы. | classifyWebVitals отдельно проверяет LCP, INP и CLS; текст различает field/lab и p75 по сегменту. | Порог не выдаётся за причинность и не смешивается с UX-выводом. |
|
||||
| Field | Runbook был рассуждением о корректирующем процессе. | validateRunbookCard требует symptom, scope, precondition, action, rollback, verification и observable результата. | Инструкция получает проверяемый вход и условие завершения. |
|
||||
|
||||
Оба источника опубликованы до cutoff. Финальная проверка доступности выполнила range-GET без сохранения документа: SSDF `206` по прямому immutable PDF; SP 800-53r5 `206` по DOI, который разрешился в immutable PDF. URL, версии, даты, применение и границы находятся также в source sections всех трёх статей.
|
||||
Источники проверены как первичные: [CSP Level 3](https://www.w3.org/TR/CSP3/), [RFC 6797 HSTS](https://www.rfc-editor.org/rfc/rfc6797.html), [Web Vitals](https://web.dev/articles/vitals), [W3C Performance Timeline](https://www.w3.org/TR/2025/CRD-performance-timeline-20250521/) и [NIST SP 800-61r2](https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-61r2.pdf). В каждой статье отдельно указано, что источник определяет и чего не доказывает о конкретном приложении.
|
||||
|
||||
## Проход 1 — факты, temporal boundary, голос
|
||||
## Проход 2 — структура, голос и проверяемость
|
||||
|
||||
- Все статьи называют `2027-08`, `2026-07-31`, плановый характер и цену ошибки в первых двух абзацах.
|
||||
- Practice самостоятельна: synthetic asset, boundary и договор о будущей проверке. Mechanism самостоятельна: synthetic path, coverage и falsifiability. Field самостоятельна: evidence hand-off без narrative о событии или проведённой проверке.
|
||||
- Голос 2025–2027: прагматичный техлидский разбор «стоимость → граница → проверяемое действие → ограничение», без best-practices списка вместо механизма.
|
||||
- `node web/scripts/upgrade-2027-08.mjs --verify-fixture`: `9/9 accepted`; article checks `3/3`.
|
||||
- Длины body без source section: practice `10 208`, mechanism `10 375`, field `10 909` знаков. Каждая остаётся в обязательном интервале `10 000–13 000`.
|
||||
| Статья | До | После | Правка |
|
||||
|---|---|---|---|
|
||||
| Practice | Заголовок и вступление обещали «безопасность» без симптома. | Первые абзацы называют XSS/downgrade, цену ошибки и маршрут Report-Only → enforce; далее идут карта ресурсов, таблица директив и ограничения. | Открытие отвечает на вопрос читателя и не обещает абсолютную защиту. |
|
||||
| Mechanism | LCP, INP и CLS шли одним списком. | Для каждой метрики добавлены пользовательский вопрос, порог, диагностический разрез и следующий тест. | Короткая речь привязана к действию, а не к каталогу терминов. |
|
||||
| Field | Runbook заканчивался советом «проверить результат». | Добавлены precondition, обратимое действие, rollback, owner-free verification и критерий закрытия. | Команда не считается восстановлением без наблюдаемого результата. |
|
||||
|
||||
## Проход 2 — literal safety и fail-closed
|
||||
Примеры запускаются над локальными данными и чистыми функциями. В коде нет обращения к сети, файловой системе, секретам, часам или security tooling. Поэтому статьи объясняют механизм и форму проверки, но не выдают fixture за evidence конкретного сервиса.
|
||||
|
||||
- Runnable examples вызывают только fixed named in-memory literals и чистые функции модуля. В модуле отсутствуют imports/API для filesystem, network, environment, clock, secrets, telemetry, system/data access и запуска security tooling.
|
||||
- Статический safety scan: `clean` для `node:fs`, `node:http`, `node:https`, `node:net`, `child_process`, `fetch`, `XMLHttpRequest`, `process.env`, `new Date`, `Date.now`, `exec`.
|
||||
- Fixture принял только `security-capstone-boundary-card-v1`; пять отрицательных literals остановились на exact status: temporal boundary, claimed path, claimed control, claimed evidence и claimed execution/owner.
|
||||
- Все неизвестные и опасные states остались `not-declared`, `not-mapped`, `not-accepted`, `not-selected`, `not-collected`, `not-assigned`, `not-opened` или `not-attempted`. Positive operational claim не имеет проходящей ветки.
|
||||
## Проход 3 — визуал, доступность и выпускная вычитка
|
||||
|
||||
## Проход 3 — SVG, mobile, a11y, safety и strict duplicate scan
|
||||
| Статья | До | После | Правка |
|
||||
|---|---|---|---|
|
||||
| Practice | Граф показывал внутреннюю карту решений. | SVG разделяет CSP и HSTS и ведёт неизвестный ресурс в stop-ветку; title, desc, alt и caption называют границу. | Рисунок объясняет объект защиты. |
|
||||
| Mechanism | Матрица была общей quality rubric. | SVG показывает LCP/INP/CLS, вопрос, порог и диагностический срез на ширине 375 px. | Визуал помогает выбрать следующий замер. |
|
||||
| Field | Петля revision не показывала условие завершения. | SVG ведёт Symptom → Precondition → Action → Verify и отдельно показывает rollback. | Рисунок закрепляет обратимость и проверку результата. |
|
||||
|
||||
- Все три SVG прошли `xmllint --noout`. В них есть `role="img"`, связанный русскоязычный `title`/`desc`; в HTML фигур присутствуют самостоятельные русские `alt` и captions.
|
||||
- SVG не содержат script, event handler, JavaScript URL, foreignObject, external reference или entity. Единственный `http`-текст — XML namespace `http://www.w3.org/2000/svg`.
|
||||
- Sharp успешно отрендерил `3/3` SVG в ширине `375px`: `375×290`, `375×300`, `375×290`. Ручной просмотр после mobile-first упрощения: все статусы и стоп-ветки читаются; горизонтального скролла и обрезанного текста нет.
|
||||
- Strict duplicate scan: body без source sections, code included, 12-word n-grams; сравнение с 36 статьями P102–P113 (`upgrade-2026-08.mjs` … `upgrade-2027-07.mjs`) вернуло `collisions: []`.
|
||||
- `node --check web/scripts/upgrade-2027-08.mjs`: passed. `npm run audit:draft -- scripts/upgrade-2027-08.mjs --expected-count=3`: passed for all exact slugs. npm emitted only pre-existing warnings about unknown user config `store-dir`, `cache-dir`, `public-hoist-pattern`.
|
||||
Три SVG прошли XML и safety scan: нет script, foreignObject, javascript:, data:image и event handlers. Sharp-рендер на 375 px проверен визуально: подписи, стрелки и стоп-ветки не обрезаны. В HTML у каждой статьи есть таблица с caption/thead/scope, runnable-пример и ordered route.
|
||||
|
||||
## Scope
|
||||
## Итоговые проверки
|
||||
|
||||
Изменены ровно пять разрешённых файлов:
|
||||
|
||||
1. `web/scripts/upgrade-2027-08.mjs`
|
||||
2. `editorial/reviews/2027-08-draft.md`
|
||||
3. `web/public/assets/editorial/2027/security-capstone-2027-attack-path-contract.svg`
|
||||
4. `web/public/assets/editorial/2027/security-capstone-2027-control-evidence-matrix.svg`
|
||||
5. `web/public/assets/editorial/2027/security-capstone-2027-review-handoff-loop.svg`
|
||||
|
||||
Registry, README, queue, `articles.json`, app, чужие пакеты и Git state не менялись.
|
||||
|
||||
## Независимая приёмка — 2026-07-31
|
||||
|
||||
### Проход 1 — факты, источник и постановка риска
|
||||
|
||||
- NIST SP 800-218 Version 1.1 (February 2022) и NIST SP 800-53 Rev. 5 (December 2020) проверены по датированным PDF. Они дают словарь практик и контролей, но статьи не используют их как доказательство существующего asset, attack path, control coverage или security test.
|
||||
- Practice, mechanism и field разделены: граница asset/path, falsifiability coverage и evidence hand-off. Первые два абзаца каждого текста называют свою цену ошибки и не объявляют закрытый путь атаки.
|
||||
|
||||
### Проход 2 — safe literal и автоматический аудит
|
||||
|
||||
- `node --check`, fixture `9/9`, public literal/deep-freeze check и `npm run audit:draft -- scripts/upgrade-2027-08.mjs` прошли. Длины body: 10 208, 10 375 и 10 909 знаков.
|
||||
- Один accepted output — `synthetic-plan-hand-off`; пять named counterexamples останавливаются fail-closed. Любой unknown input также останавливается, а accepted effect остаётся `not-attempted`.
|
||||
- XML и SVG safety scan прошли без запрещённого active content.
|
||||
|
||||
### Проход 3 — визуал, overlap и выпуск
|
||||
|
||||
- Три схемы повторно отрендерены в 375 px: contract, coverage matrix и hand-off loop сохраняют читаемые labels и stop-границы, а captions уточняют, что это не карта реальной системы.
|
||||
- Strict scan P102–P114 исключает sources, но включает code: 39 статей, 741 сравнение, `collisions: []`.
|
||||
- В реестр добавлены ровно три августовские revisions; пользовательские app/data files не включены.
|
||||
- node --check scripts/upgrade-2027-08.mjs — PASS.
|
||||
- node scripts/upgrade-2027-08.mjs --verify-fixture — PASS, 7/7.
|
||||
- npm run audit:draft -- scripts/upgrade-2027-08.mjs — PASS, 3/3 exact slugs.
|
||||
- npm run audit:articles для трёх августовских slug — PASS.
|
||||
- xmllint --noout, SVG safety scan и Sharp 375 px — PASS для трёх assets.
|
||||
- Cross-scan body с включённым code и исключёнными source lists — без 12-словных повторов в общей партии.
|
||||
|
||||
Reference in New Issue
Block a user