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

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

Практическая работа: классификация лицензий и реестр с вердиктами

Цель

Провести набор лицензий из реального SBOM через цепочку «evidence → нормализация → вердикт → запись в реестр» и собрать классификатор с таблицей обязательств. Проверяемый результат — заполненный реестр лицензий, где у каждого компонента есть SPDX-выражение, класс и вердикт.

Входные данные

Шаги

Шаг 1. Извлечь сырьё (evidence)

Выгрузите из SBOM пары «компонент → исходная строка лицензии». Если строка свободная (BSD-like, Apache 2, пусто, NOASSERTION) — оставьте её как есть, это и есть evidence.

# извлечь компоненты и их лицензии из CycloneDX (jq)
jq -r '.components[] | [.purl, (.licenses // [] | tostring)] | @tsv' sbom.cdx.json

Шаг 2. Нормализовать в SPDX-выражение

Каждую строку приведите к каноничному SPDX-идентификатору или выражению. Учтите: - GPL-2.0 → GPL-2.0-only или GPL-2.0-or-later (решите, что заявлено, и обоснуйте); - множественные лицензии → (MIT OR Apache-2.0) (выбор) либо Apache-2.0 AND MIT (оба); - лицензия с исключением → GPL-2.0-only WITH Classpath-exception-2.0; - нераспознанное → пометьте как NOASSERTION и в очередь на доразметку (не выдумывайте идентификатор).

Шаг 3. Классифицировать

Каждому выражению присвойте класс и обязательство:

purl evidence (raw) SPDX-выражение Класс Триггер copyleft Обязательство
pkg:npm/a@1 MIT MIT permissive — атрибуция
pkg:npm/b@2 LGPL LGPL-3.0-only weak copyleft статическая линковка открыть изменения компонента
pkg:pypi/c@3 GPL3 GPL-3.0-only strong copyleft линковка в произведение открыть производный продукт
pkg:npm/d@4 Affero AGPL-3.0-only network copyleft использование по сети открыть исходники SaaS
pkg:npm/e@5 пусто NOASSERTION unknown ? требуется заключение

Шаг 4. Вынести вердикт с учётом контекста

Для каждого компонента дайте один из вердиктов разрешено / условно (с обязательством) / блокер / требуется заключение, исходя из того, как продукт распространяется (закрытый бинарник, дистрибутив с исходниками, сетевой сервис). Зафиксируйте автора, дату, обоснование. Сценарий «network copyleft в SaaS» и любую проприетарную/LicenseRef-* лицензию ведите как блокер или заключение.

Шаг 5. Записать в реестр

Сведите результат в реестр лицензий: компонент, выражение, класс, вердикт, обоснование, срок пересмотра. Кейсы-исключения (приняли риск осознанно) оформите отдельно.

Ожидаемый результат

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

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

Показать преподавателю заполненный реестр, где: (1) для каждого компонента есть и evidence, и нормализованное SPDX-выражение; (2) проставлен класс и обязательство; (3) вынесен вердикт с учётом способа распространения; (4) все unknown имеют ответственного. Минимум один copyleft-кейс доведён до условного вердикта с конкретным обязательством.

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