revise May 2023 static analysis articles
Build and deploy / deploy (push) Successful in 16s

This commit is contained in:
2026-07-31 14:49:05 +03:00
parent b56f7e94b9
commit bb964e1f54
7 changed files with 833 additions and 1 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
# Производство редакционных партий
На 31 июля 2026 года строгий аудит проходит 190 из 358 созданных материалов. Остальные 168 не считаются «почти готовыми»: их нужно заменить, а не косметически удлинить.
На 31 июля 2026 года строгий аудит проходит 193 из 358 созданных материалов. Остальные 165 не считаются «почти готовыми»: их нужно заменить, а не косметически удлинить.
## Одна партия
+38
View File
@@ -0,0 +1,38 @@
# П63 · 2023-05 · Статический анализ — три прохода саморевью
## Рамка пакета
- Slug: `editorial-2023-05-practice-static-analysis`, `editorial-2023-05-mechanism-static-analysis`, `editorial-2023-05-field-static-analysis`.
- Голос: М6, май 2023. Автор пишет как инженер надёжности и безопасности: различает контракт инструмента, project context и policy decision; не заменяет их риторикой, личным опытом или непроверенными цифрами.
- Три статьи не повторяют друг друга: practice разбирает классификацию шумного сигнала; mechanism отделяет SARIF, rule, result и context record; field фиксирует keep/tune/scoped suppress, owner, expiry и rollback.
- Sidecar создаёт ровно пять файлов: этот review, `web/scripts/upgrade-2023-05.mjs` и три SVG с префиксом `static-analysis-2023-`. Скрипт не записывает `articles.json`, registry, README, очередь, Git или чужие файлы.
- Fixture использует только `synthetic-static-analysis-input-v1`. URI, строка, ruleId, revision, fingerprint, message и context — учебные значения, созданные в памяти. Они не получены из репозитория, SARIF-файла, scanner, CI, CVE, trace, baseline или production runtime.
## Проход 1 — источники, факты и границы
- Источники перепроверены 31.07.2026 по первичным или официальным страницам; все были опубликованы до мая 2023. [OASIS SARIF 2.1.0](https://docs.oasis-open.org/sarif/sarif/v2.1.0/os/sarif-v2.1.0-os.html) имеет статус OASIS Standard и дату 27.03.2020; рядом указан его [JSON Schema](https://docs.oasis-open.org/sarif/sarif/v2.1.0/os/schemas/sarif-schema-2.1.0.json). [Semgrep v1.20.0](https://github.com/semgrep/semgrep/releases/tag/v1.20.0) опубликован 28.04.2023; в [исходнике CLI с этим тегом версии](https://github.com/semgrep/semgrep/blob/v1.20.0/cli/src/semgrep/commands/scan.py#L502-L506) объявлена опция `--sarif`. [NIST SP 800-218 SSDF v1.1](https://doi.org/10.6028/NIST.SP.800-218) имеет статус Final от 03.02.2022.
- Формулировки разграничены: SARIF описан как format interchange, а не как модель application; Semgrep source подтверждает наличие CLI output option в указанной версии, а не запуск этой версии здесь; SSDF используется как рамка владения и evidence, а не как доказательство эффективности правил.
- Одна опасная категория названа без ложного verdict: конструкция команды из недоверенного значения. Rule match не назван finding, CVE, доказанной достижимостью, exploitability или production risk. У result сохраняются `sourceRead: not-performed-by-fixture`, `scannerExecution: not-performed-by-fixture`, `reachability: not-assessed-by-fixture` и `securityOutcome: not-determined-by-fixture`.
- `buildSyntheticSarifLog()` строит один учебный SARIF 2.1.0 log только в памяти; `classifySyntheticSignal()` принимает отдельную context record и возвращает `context-incomplete`, если нет asset, entry point, trust boundary, owner или release scope. `planSyntheticRuleDecision()` допускает только keep, tune и scoped suppress; global disable не является допустимым action. После независимой приёмки он принимает только календарные ISO-даты, требует `reviewBy <= expiresOn` для suppress и отклоняет tune с прежней revision. `rollbackSyntheticRuleDecision()` возвращает только state учебного плана и не заявляет config effect.
- В fixture 24 детерминированные assertion: есть positive path и negative cases для неверного kind, другой версии SARIF, отсутствующей trust boundary, global disable, suppress без scope/expiry, несуществующей календарной даты, review после expiry и tune без требуемых evidence или с прежней revision. В коде отсутствуют file I/O, network, shell execution, scanner invocation, package installation, реальный исходный код и real-world output.
## Проход 2 — голос, полнота и объём
- Первые два абзаца каждой статьи сначала называют наблюдаемую проблему и цену: потеря сигнала после глобального отключения; ошибка переноса SARIF-полей в project decision; отсутствие owner/scope/rollback у исключения. Затем материал проходит по маршруту «симптом → причина → проверка → действие».
- В каждом материале есть отдельная доступная таблица, invocable synthetic fixture, упорядоченная последовательность, содержательная SVG-фигура с `alt` и подписью, ограничения модели, rollback и следующий шаг. Rule YAML явно помечен учебным fragment и не выдаётся за запущенное правило.
- `npm run audit:draft -- scripts/upgrade-2023-05.mjs` измерил основной текст без списка источников: practice — 8 253 знака, mechanism — 8 382, field — 9 442. Все три статьи находятся в требуемом диапазоне 5–15 тыс. и в целевом диапазоне 8–10 тыс. знаков для этой темы.
- Редакционный проход убрал универсальные обещания и несуществующий опыт: нет заявлений об actual false-positive rate, coverage, real findings, CVE, сканировании, runtime, эффективности policy или результатах команды. М6-язык называет объекты и границы: rule revision, SARIF version, result fingerprint, trust boundary, owner, scope, expiry, rule diff и config rollback.
## Проход 3 — визуалы, безопасность и выпуск
- `triage-funnel` объясняет путь от rule/result через форму и context к разрешённым решениям; `rule-context` разделяет владельцев данных; `decision-gate` показывает evidence для keep/tune/suppress, отдельный масштаб global policy и rollback. После первого рендера узкие подписи во второй и третьей схеме были перепроектированы; повторный просмотр на 375 px подтвердил, что labels не обрезаются и последовательность читается.
- Все три SVG прошли `xmllint --noout`. Safety scan не нашёл `script`, `foreignObject`, inline event handler, `javascript:` или `data:image`. В SVG нет внешних ресурсов, пользовательского ввода, интерактивного кода или embedded raster.
- Sharp повторно отрендерил фигуры на ширине 375 px и ручной просмотр PNG подтвердил видимые заголовки, стрелки, критичные поля и нижние оговорки. Фигуры описывают synthetic policy contract, не scanner report и не production trace.
- Выпускной проход подтверждает только sidecar: `node --check` — PASS; fixture — PASS 24/24 после независимого model review; draft audit — PASS; import-safe export содержит ровно три revision без `date`/`author`; XML, SVG safety scan и Sharp review — PASS. Registry, README, `articles.json`, очередь, Git, commit и push не затрагивались. Интеграцию и отдельную редакторскую приёмку оставлены главному агенту.
## Приёмка главного редактора
- Источники сверены отдельно от текста: OASIS SARIF подтверждает статус OASIS Standard и дату 27.03.2020; GitHub API подтверждает публикацию Semgrep v1.20.0 28.04.2023, а raw source того же тега — опцию `--sarif`; NIST CSRC фиксирует SP 800-218 Final от 03.02.2022. Ни один из этих источников не используется как свидетельство запуска анализатора в этом репозитории.
- Независимый model review нашёл два пропуска. План раньше принимал невозможную календарную дату и permit-ил `tune` с прежней rule revision; для suppress также не было отношения между `reviewBy` и `expiresOn`. Добавлены строгая проверка ISO-даты, правило `reviewBy <= expiresOn`, запрет на неизменённую revision и три negative case. Fixture теперь проходит 24/24, а не только проверяет наличие непустых строк.
- Визуальный review на 375 px подтвердил читаемость трёх SVG. На воронке triage диагональный крест пересекал подпись о global disable; его заменили компактной иконкой, чтобы запрет и причина не конкурировали за один слой.
- После подключения ровно трёх revision строгий audit подтвердил 8 426 / 8 382 / 9 814 знаков, по одной фигуре, таблице и примеру в каждой статье; импортный registry содержит 184 уникальные revision. Production build прошёл с 374 статическими страницами. `articles.json` и чужие изменения не редактировались.