Files
huncode bb964e1f54
Build and deploy / deploy (push) Successful in 16s
revise May 2023 static analysis articles
2026-07-31 14:49:05 +03:00

39 lines
11 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.
# П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` и чужие изменения не редактировались.