Пиков / КАПО
Как читать авторский курс и нормативные материалы

Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин OSA в разных материалах имеет разный охват. Статус и обязательность нормативного документа проверяются отдельно; проект КАПО опубликован как проект первой редакции.

П26. Лицензионная классификация

Зачем эта практика Лицензий сотни, и держать в голове каждую невозможно. Но обязательства сводятся к небольшому числу поведенческих классов — и вердикт зависит от класса, а не от имени. Эта практика — без инструментов: вы берёте сырые строки licenses из реального SBOM и руками раскладываете их на классы, превращая хаос строк в таблицу с предсказуемыми обязательствами. Это фундамент, на котором затем работают автоматы П11/П12 и заключения П27.

Цель

Из набора лицензионных выражений (из готового SBOM соисполнителя или учебного списка) построить классификатор: каждое выражение → класс → обязательство при распространении → итоговая зона (разрешено / риск / запрещено / требуется заключение). Проверяемый результат — заполненная таблица, где для каждой строки указан класс и зона, а все NOASSERTION/LicenseRef-* вынесены в отдельную очередь, а не помечены «зелёным».

Команда или действие

Это аналитическое упражнение. Источник — поле licenses из SBOM. Извлечь список можно так (CycloneDX JSON):

# Уникальные лицензионные выражения из CycloneDX-SBOM
jq -r '.components[].licenses[]? | (.expression // .license.id // .license.name)' \
  sbom.cdx.json | sort | uniq -c | sort -rn

Дальше — ручная классификация по эталонной матрице (заполняется самостоятельно):

Выражение Класс Обязательство при распространении Триггер copyleft Зона
MIT permissive сохранить текст лицензии и атрибуцию нет разрешено
Apache-2.0 permissive атрибуция + патентный грант нет разрешено
LGPL-3.0-or-later weak copyleft открыть изменения самого компонента статическая линковка риск
MPL-2.0 weak copyleft открыть изменённые файлы пофайлово риск
GPL-3.0-only strong copyleft открыть весь производный продукт линковка в одно произведение требуется заключение
AGPL-3.0-only network copyleft открыть исходники даже при работе по сети сетевое взаимодействие запрещено*
(MIT OR GPL-2.0-only) dual → выбрать MIT выбор одной из двух — разрешено (при выборе MIT)
LicenseRef-custom-eula проприетарная/кастом условия читать вручную — требуется заключение
NOASSERTION unknown вердикт невозможен — очередь доразметки

NOASSERTION — это не «зелёный» Пустая или нераспознанная лицензия опаснее «плохой, но понятной»: пока класс неизвестен, вердикта нет, а значит компонент юридически не готов к выпуску. Не сворачивайте NOASSERTION в «вероятно MIT» — это отдельная зона «требуется доразметка» с ответственным и сроком. То же касается LicenseRef-*: их нет в SPDX License List, автоматика их пропускает.

Что вы должны увидеть

После jq-среза — таблица частот выражений, например:

  31 MIT
  12 Apache-2.0
   5 ISC
   3 BSD-3-Clause
   2 LGPL-3.0-or-later
   1 GPL-3.0-only
   1 NOASSERTION

После классификации — заполненная матрица, где видно распределение по зонам. Ориентир для типичного npm/pypi-дерева: подавляющее большинство (80–95%) попадает в permissive, единицы — в weak/strong copyleft, и почти всегда есть хотя бы один NOASSERTION или нестандартное выражение. Если в вашей таблице нет ни одной строки в зонах «риск/требуется заключение/доразметка» — скорее всего вы пропустили dual licensing (OR прочитан как «обе действуют») или не заметили транзитивную copyleft-зависимость.

Разбор спорного выражения MIT OR GPL-2.0-only — это выбор, а не сумма: Организация имеет право взять MIT и не брать на себя copyleft. Ошибка чтения «обе лицензии действуют» приводит к добровольному принятию лишних обязательств. В таблице такая строка идёт в зону «разрешено» с явной пометкой «выбран MIT» — выбор должен быть зафиксирован, иначе аудитор не поймёт, на каком основании компонент разрешён.

Если не получилось

Типичные ошибки - Классификация по имени, а не по поведению — BSD без номера двусмыслен (2-Clause/3-Clause/4-Clause); GPL-2.0 устарел, нужно GPL-2.0-only либо -or-later, и это разные вердикты (можно ли уйти на GPL-3.0). - OR прочитан как AND — dual licensing даёт право выбора; трактовка «обе действуют» завышает обязательства. - NOASSERTION помечен «разрешено» — самая дорогая ошибка: непроверенный компонент выпущен как чистый. - Учтены только прямые зависимости — транзитивные под copyleft не попали в таблицу. Вердикт нужен и им; берите полное дерево из SBOM, а не только dependencies верхнего уровня.

Критерий зачёта

Показать преподавателю заполненную классификационную таблицу по реальному (или учебному) набору лицензий, где: (1) каждое выражение отнесено к поведенческому классу; (2) проставлена итоговая зона; (3) все NOASSERTION/LicenseRef-* вынесены в очередь доразметки, а не в «разрешено»; (4) разобран минимум один dual-licensing-кейс с зафиксированным выбором. Таблица из одних permissive-строк без единого спорного случая не засчитывается — нужно показать умение распознавать риск.

Нормативная связка