Запровадила перевірку сумісності ліцензій 644 крейтів Rust під час кожної збірки й довела, що вона спрацьовує, переписавши ліцензію одного крейта та змістивши зафіксовану ревізію ядра без перегенерації.
Роботу виконано: вересень 2026
644 крейтів Rust перевіряються на ліцензію під час кожної збірки
Ситуація. Якщо ядро на Rust скомпоновано із застосунком, який постачають користувачам, то разом із ним постачається все, від чого це ядро залежить. Граф залежностей налічує 644 крейти. Кожен має ліцензію, деякі — більше ніж одну, а один‑єдиний копілефтний крейт, що з’являється на три рівні нижче після рутинного оновлення версії, змінює умови, на яких можна розповсюджувати весь застосунок, — непомітно, у lock‑файлі, який ніхто не читає рядок за рядком.
Завдання. Ліцензійний статус треба було перевіряти під час кожної збірки, а не переглянути один раз, причому з явним списком дозволених умов, щоб зміна в графі спричиняла помилку збірки, а не ставала відкриттям, яке згодом зробить хтось інший.
Дія. Перевірка будує повний транзитивний граф залежностей і звіряє ліцензійний вираз кожного крейта зі списком умов, які приймає проєкт, коректно обчислюючи булеві вирази — крейт, що пропонує вибір між двома ліцензіями, прийнятний, якщо в списку є хоча б одна з них, а крейт, що вимагає обох, прийнятний, лише якщо в списку є обидві. Усе, що не збігається, призводить до помилки збірки, а не до попередження, а додати умову до списку дозволених можна лише свідомою правкою з обґрунтуванням. Перевірку, яка жодного разу не спрацювала, неможливо відрізнити від тієї, яка спрацювати не здатна, тож її двічі навмисно змусили спрацювати. Перший раз — переписавши ліцензійний вираз крейта на такий, якого список не приймає: це відтворює ситуацію, коли автори крейта змінюють його умови між версіями, — випадок, якого не помітить жодне рев’ю, бо сам крейт не новий. Другий раз — змістивши закріплену ревізію ядра без повторної генерації перевірки: це відтворює оновлення ядра, яке непомітно тягне за собою нову залежність. В обох випадках збірка, як і задумано, завершилася з помилкою, і перевірку залишили як є, не розширюючи її.
Результат. Право на розповсюдження перевіряється під час кожної збірки, і відомо, що перевірка працює, бо її змусили спрацювати, а не тому, що вона ніколи нічого не повідомляла. До її появи і пакет, і файл ліцензії, і власний README проєкту стверджували про 644 крейти те, чого ніщо не перевіряло. Межа цієї перевірки чітка, і її не варто перебільшувати: перевірка читає задекларовані ліцензійні метадані, а метадані можуть бути хибними або неповними. Вона нічого не доводить щодо крейта, який неправильно декларує свою ліцензію, і не є юридичною консультацією.
Перегляньте повне портфоліо.
Клієнтам ми розповідаємо це як Знайте ліцензію всього, що випускаєте — подивитися разом з іншими кейсами.
Одна частина довшого переліку — і він увесь на цьому сайті.
Кожен запис написано однаково: ситуація, завдання, що ми зробили і що змінилося.