Code review в оборонному ПЗ — не та сама діяльність, що code review в комерційному SaaS-шопі. Механіка виглядає схожою — pull request, рев'юер, коментарська ланцюжок, схвалення — але модель загроз, вимоги до аудитованості та юридична експозиція інакші. Рев'юер у cleared-програмі не просто ловить баги; він виробляє акредитаційні докази, забезпечує грифові кордони і виступає однією з двох сторін у two-person rule на кодових шляхах, що можуть закінчити роботою всередині бойової системи NATO.

Ця стаття — інженерний огляд того, як команди cleared-програм структурують code review: хто маршрутизує до кого, як виглядає PR-шаблон, як вписується статичний аналіз без leak'у вихідного коду, як заморозки CWIX та інтеграційні вікна переформатовують гейт рев'ю, і як документальний слід задовольняє аудитора через роки після merge.

1. Чому оборонне code review інакше

Перший принцип: в оборонному ПЗ модель загроз противника припускає інсайдерів. Комерційний рев'ю-процес оптимізує для ловлі чесних помилок довіреною командою. Оборонний рев'ю-процес має також підвищувати вартість свідомо зловмисної зміни допущеним розробником із легітимним commit-доступом. Це змінює, як ви читаєте diff. Тонкий переворот константи в криптографічному порівнянні, тихе розширення мережевого ACL, новий outbound URL, підсунутий у конфіг — це патерни, які оборонному рев'юеру платять помічати, а не лише опечатки й відсутні тести.

Другий принцип: вихідний код у cleared-програмах сам по собі засекречений, або принаймні контрольований. Бранч-протекшени репозиторія, рівень допуску рев'юера, мережа, в якій відбувається рев'ю, та інструменти, яким дозволено читати diff — усе це частина ланцюга обробки грифу. Рев'ю, виконане в інструменті, що відправляє diff'и в некліровану SaaS-бекенд, — це spill. Вибір платформи — це контроль безпеки, а не IT-вподобання.

Третій принцип: кожен рев'ю — це аудитований доказ. Асесори AQAP 2110, DCMA-софтверні аудитори та акредитаційні чиновники через роки запитають: хто схвалив цю зміну, проти якого checklist, з якими доказами тестового покриття, на яку дату відносно security-baseline? Тред PR — це відповідь. Якщо тред порожній — "LGTM, мерджу" — відповіді немає.

2. Маршрутизація рев'юерів — CODEOWNERS для грифу

Механічний хребет cleared-program рев'ю-процесу — це CODEOWNERS-файл, що кодує гриф, а не лише командну власність. Комерційний рядок CODEOWNERS говорить "ця директорія належить platform-команді." Оборонний рядок CODEOWNERS говорить "ця директорія містить код, що торкається інтерфейсів засекреченої мережі; рев'юери мають тримати щонайменше SECRET-допуск і один з них має бути в команді cross-domain solution."

Конкретно це забезпечується через три шари. Перший — CODEOWNERS-файл маршрутизує PR'и до clearance-тегованих команд GitHub або Azure DevOps (наприклад, @org/cleared-secret-reviewers, @org/nato-interop-reviewers). Другий — ці команди наповнюються лише через контрольований provisioning-скрипт, що крос-референсує корпоративний реєстр допусків — додавання до команди саме по собі є аудитованою подією. Третій — правила бранч-протекшну вимагають схвалення від маршрутизованої команди, не просто будь-якого рев'юера з write-доступом. Рев'юер поза cleared-командою не може задовольнити правило протекшну, навіть якщо тисне "Approve."

Для директорій з вищим імпактом — криптографічні примітиви, логіка позначення грифу, код cross-domain guard — політика "дві допущені пари очей." Бранч-протекшн вимагає щонайменше двох схвалюючих рев'юерів з cleared-команди, обоє з яких явно рев'юнули протягом останніх 24 годин (stale-схвалення dismiss'аться на push). Це механічна реалізація two-person rule у source control.

3. Security-checklists у PR-шаблонах

PR-шаблон — це те, де дисципліна рев'ю стає читаною для аудиторів. Оборонний PR-шаблон — це не триряд "що / чому / як" з SaaS-шопу. Це структурований checklist, який автор заповнює, а рев'юер перевіряє, рядок за рядком, з коментарським тредом як записом доказів.

Робочий шаблон покриває: STIG-крос-референси (які DISA STIG-контролі ця зміна торкається і чи зберігає вона сумісність?), OWASP ASVS-пункти для будь-якої application-layer зміни (валідація входу, кодування виходу, обробка сесій на рівні верифікації, до якого програма акредитована), гриф будь-яких даних, що зміна обробляє, дельта покриття тестами з явними числами та декларацію, чи зміна торкається export-контрольованої криптографії або інтероп-інтерфейсів.

Патерн "checklist-as-code" — правильна реалізація: PR-шаблон живе в .github/PULL_REQUEST_TEMPLATE.md (або еквіваленті Azure DevOps), version-controlled, і зміни до нього самі вимагають рев'ю. Акредитаційний офіцер може на запит видати точну версію checklist, що була активна, коли merge'ився даний PR. Ця прослідковуваність — те, що перетворює checklist із гігієнічної звички на акредитаційний доказ.

4. Статичний аналіз як допомога рев'юеру

Статичний аналіз у оборонному pipeline — не заміна людському рев'ю; це підсилювач, що дає допущеному рев'юеру витрачати свою увагу на патерни, які може зловити лише людина. Стандартний стек: Semgrep із кастомними правилами, налаштованими під модель загроз програми, GitHub CodeQL-запити для taint-аналізу на потоках даних, що перетинають грифові кордони, та language-specific глибокий аналізатор (Coverity, on-prem SonarQube або еквівалент) для memory-safety і concurrency багів у C/C++ або unsafe-блоках Rust.

Шар кастомних правил — частина, що найбільше важить. Стоковий OWASP-рулсет зловить generic SQL-ін'єкцію. Program-specific Semgrep-правило ловить "будь-яку функцію, що випромінює в outbound interop-сокет без попереднього прогону через валідатор classification-marker." Ці правила самі є рев'юованими артефактами, що акредитаційна команда може інспектувати.

Реальність "AI-assisted рев'ю без leak'у вихідного коду" варто назвати прямо. Cleared-програми не можуть пайпити свої diff'и в публічний LLM-ендпоінт. Прийнятні шляхи: on-prem інференс-розгортання на мережі програми, суверенний cloud LLM, що хоститься всередині акредитованої межі, або жодного LLM на засекречених гілках. CTO, що тихо вмикає SaaS-code-review-copilot на cleared-репозиторії, щойно написав spill-репорт. Правильна архітектура ізолює AI-допомогу в контрольовані анклави й ставиться до самої моделі як до компонента у скоупі акредитації.

5. Gate'и рев'ю, прив'язані до CWIX

Для будь-якої програми, що торкається NATO-інтероперабельності — coalition C2, федерована логістика, link-layer адаптери — щорічний цикл CWIX (Coalition Warrior Interoperability eXercise) переформатовує календар рев'ю. PR'и, що торкаються інтероп-коду, підпадають під два додаткові gate'и, яких комерційні команди ніколи не бачать.

Перший — будь-яка зміна до інтерфейсу, узгодженого з NATO STANAG (STANAG 5066, мітки конфіденційності 4774/4778, адаптери Link 16/22, інтерфейси FMN spiral) маршрутизується до обов'язкового STANAG-доменного рев'юера на додачу до стандартного cleared-рев'юера. Робота цього рев'юера — верифікувати зміну проти активного видання STANAG та плану інтероп-тестування програми. Схвалюючий підпис тут — те, що пізніше дозволяє інтеграційній команді стверджувати сумісність.

Другий — інтеграційні тести мають проходити проти коаліційного тестового харнесу програми перед merge, не лише unit-test-сюїт. Зелений unit-тест-прогін із червоним коаліційним харнесом — це блокуючий провал, не "виправимо пізніше."

Патерн "no-merge-during-CWIX-freeze" — третій gate. У чотири-шість тижнів навколо події CWIX інтероп-гілка заморожена для всього, крім CWIX-scope виправлень, підписаних лідом вправи. Комерційні команди вважають це дезорганізаційним; cleared-команди планують свій roadmap навколо нього. Заморозка нон-негоціативна, бо last-minute merge, що ламає інтеграцію коаліційного партнера в Бидгощі, коштує програмі довіри, що відбудовується роками.

6. Two-person rule для чутливого коду

Деякі шляхи коду заслуговують вищої планки, ніж навіть cleared-team-дефолт. Криптографічні примітиви — key derivation, генерація випадкових чисел, верифікація підписів — отримують двох cleared-рев'юерів із явною криптографічною компетенцією, нотованою в їх рев'юер-профілі. Код обробки ключів (будь-яка функція, що торкається приватного ключа, сесійного ключа або key-wrapping ключа у cleartext) отримує те саме. Шляхи засекречених даних — код, що маршалить дані, помічені як засекречені, через process-кордон — отримують те саме.

Дисципліна — це не просто "двоє людей схвалюють." Це двоє людей, кожен з яких може незалежно пояснити акредитаційному офіцеру, чому зміна безпечна. Rubber-stamp друге схвалення гірше за одне схвалення, бо воно фабрикує фальшиву впевненість. Програми забезпечують це культурно — ротуючи, хто є "primary"-рев'юером на чутливих PR'ах, та вимагаючи, щоб кожен рев'юер залишав суттєвий коментар, не лише thumbs-up.

Те саме правило вищої планки застосовується до SBOM-впливаючих змін: додавання нової third-party залежності в cleared-програму — це two-cleared-eyes-подія, бо supply-chain-ризик в скоупі.

Ключовий висновок: Two-person rule не сповільнює cleared-програми — їх сповільнює ставлення до кожного PR як до key-handling-зміни. Дисципліна — це селективна суворість: агресивна маршрутизація high-impact файлів, легкий рев'ю для решти. CODEOWNERS — це як ви виражаєте селективність у коді.

7. Документальний слід для аудиторів

Опис PR — це акредитаційний доказ. Через роки після merge програма буде аудитована — DCMA, при акредитаційному поновленні, командою незалежної верифікації державного замовника або власною quality-командою програми, що готується до AQAP-нагляду. Аудитор запитає: покажіть мені кожну зміну до модуля X між датами Y і Z, з рев'юером, версією checklist, доказами тестів та обґрунтуванням безпеки. Аудиторська відповідь — це search-query проти PR-історії. Якщо описи PR порожні, відповідь — "ми не можемо видати цей запис" — і це саме по собі findings.

Вимога searchable-history тягне три конкретні практики. Перша — заголовки PR слідують конвенції, що включає торкнутий компонент і грифовий скоуп, тож grep по git-логу дає корисні результати. Друга — описи PR посилаються на change-request, секцію тест-плану та STIG- або STANAG-контроль, що торкнутий — ці посилання самі grep'абельні. Третя — платформа налаштована утримувати тред коментарів PR упродовж повного вікна ретенції програми, що для багатьох cleared-програм — оперативне життя системи плюс багаторічний хвіст. SaaS-code-платформа, що чистить старі PR-треди, не прийнятна для cleared-програми; on-prem або суверенно-cloud хостинг — це відповідь.

Та сама дисципліна ретенції застосовується до CI-логів, що доводять, що тест пройшов на момент merge. Рев'юер, що каже "тести пройшли" без прив'язаного ідентифікатора CI-прогону, виробив неперевірне твердження.

8. Культура рев'ю на масштабі

Найважча частина дисципліни cleared-program-рев'ю — це не інструменти — CODEOWNERS, бранч-протекшени, PR-шаблони механічно прямолінійні. Найважча частина — це культура: підтримання дисципліни через команду з п'ятдесяти cleared-інженерів під тиском поставки рік за роком без ерозії дисципліни у rubber-stamping.

Онбординг cleared-рев'юерів — перша точка важеля. Нові рев'юери шедоулять старших рев'юерів на свої перші десять PR'ів, лишаючи co-signed коментарі. Їх не додають у CODEOWNERS-команду, поки старший рев'юер не підпише їх калібрування. Інвестиція нетривіальна — два-три тижні часу старшого рев'юера на нового найманого — але це ціна збереження планки.

Калібрувальні сесії — друга точка важеля. Щоквартально пул cleared-рев'юерів зустрічається, щоб разом рев'юнути зразок недавніх PR'ів, винести розбіжності щодо того, що мало бути позначене, та оновити рев'ю-плейбук команди відповідно. Це як тiche знання команди стає явним і передаваним, і як плейбук залишається сучасним по мірі еволюції моделей загроз.

Напруга "швидкі рев'ю vs ретельні рев'ю" реальна й не може бути проігнорована. Команди cleared-програм розв'язують її, явно вирішуючи, які PR отримують яке трактування. Bump залежності, що проходить SBOM-gate і не торкається cleared-коду, може отримати швидку доріжку. Зміна до classification-marker-валідатора отримує повний two-cleared-eyes багатоденний цикл, крапка. Рев'ю-SLA команди бімодальна за дизайном, а не єдине середнє, що прикидається, що кожна зміна однакова.

Нічого з цього не працює без підтримки керівництва. Перший раз, коли program-manager тисне на рев'юер-пул "просто схваліть, ми пізно на мильстоуні," дисципліна починає вмирати. Програми, що переживають акредитацію, — це ті, де engineering-лід має позицію сказати "ні" цьому тиску — і де програмний офіцер замовника розуміє, що рев'ю-gate — це те, що робить deliverable акредитовним у першу чергу. Cleared-команда — це не лише реєстр допусків; це культура рев'ю, яку допуски роблять можливою.