# Запровадила перевірку сумісності ліцензій 644 крейтів Rust під час кожної збірки й довела, що вона спрацьовує, переписавши ліцензію одного крейта та змістивши зафіксовану ревізію ядра без перегенерації.

вересень 2026

**Ситуація.** Якщо ядро на Rust скомпоновано із застосунком, який постачають користувачам, то разом із ним постачається все, від чого це ядро залежить. Граф залежностей налічує 644 крейти. Кожен має ліцензію, деякі — більше ніж одну, а один‑єдиний копілефтний крейт, що з'являється на три рівні нижче після рутинного оновлення версії, змінює умови, на яких можна розповсюджувати весь застосунок, — непомітно, у lock‑файлі, який ніхто не читає рядок за рядком.

**Завдання.** Ліцензійний статус треба було перевіряти під час кожної збірки, а не переглянути один раз, причому з явним списком дозволених умов, щоб зміна в графі спричиняла помилку збірки, а не ставала відкриттям, яке згодом зробить хтось інший.

**Дія.** Перевірка будує повний транзитивний граф залежностей і звіряє ліцензійний вираз кожного крейта зі списком умов, які приймає проєкт, коректно обчислюючи булеві вирази — крейт, що пропонує вибір між двома ліцензіями, прийнятний, якщо в списку є хоча б одна з них, а крейт, що вимагає обох, прийнятний, лише якщо в списку є обидві. Усе, що не збігається, призводить до помилки збірки, а не до попередження, а додати умову до списку дозволених можна лише свідомою правкою з обґрунтуванням. Перевірку, яка жодного разу не спрацювала, неможливо відрізнити від тієї, яка спрацювати не здатна, тож її двічі навмисно змусили спрацювати. Перший раз — переписавши ліцензійний вираз крейта на такий, якого список не приймає: це відтворює ситуацію, коли автори крейта змінюють його умови між версіями, — випадок, якого не помітить жодне рев'ю, бо сам крейт не новий. Другий раз — змістивши закріплену ревізію ядра без повторної генерації перевірки: це відтворює оновлення ядра, яке непомітно тягне за собою нову залежність. В обох випадках збірка, як і задумано, завершилася з помилкою, і перевірку залишили як є, не розширюючи її.

**Результат.** Право на розповсюдження перевіряється під час кожної збірки, і відомо, що перевірка працює, бо її змусили спрацювати, а не тому, що вона ніколи нічого не повідомляла. До її появи і пакет, і файл ліцензії, і власний README проєкту стверджували про 644 крейти те, чого ніщо не перевіряло. Межа цієї перевірки чітка, і її не варто перебільшувати: перевірка читає задекларовані ліцензійні метадані, а метадані можуть бути хибними або неповними. Вона нічого не доводить щодо крейта, який неправильно декларує свою ліцензію, і не є юридичною консультацією.

---

- Роль: Інженер зі збірки та релізів
- Категорії: [Управління даними](https://data.engineer.company/uk/categories/data-governance/), [DevOps](https://data.engineer.company/uk/categories/devops/), [Автоматизація та CI/CD](https://data.engineer.company/uk/categories/automation/), [Безпека](https://data.engineer.company/uk/categories/security/), [Документація](https://data.engineer.company/uk/categories/documentation/)
- Послуги: [Data Governance та якість даних](https://data.engineer.company/uk/services/data-governance/), [DevOps та автоматизація CI/CD](https://data.engineer.company/uk/services/devops-cicd/), [Безпека та керування доступом](https://data.engineer.company/uk/services/security-access/)

<https://data.engineer.company/uk/portfolio/audited-644-rust-crates-for-licence-compatibility-163/>
