AI пишет код. Где доказательства?
Proofpack связывает контракт, реализацию и аудит в верифицируемую цепочку. Proof artifacts - недостающий примитив AI-кодогенерации.
AI сгенерировал функцию за секунды. Три модели провели ревью. Все сказали “выглядит хорошо”. Вопрос: где артефакт, который это подтверждает?
Не “модель одобрила” - где машиночитаемое свидетельство того, что было проверено, против чего, и с каким результатом? В software supply chain такой артефакт называется attestation. Для AI-сгенерированного кода его не существует.
Proofpack: что внутри
Вот как выглядит proofpack.json после прогона Signum:
{
"schemaVersion": "4.0",
"createdAt": "2026-03-04T14:23:07Z",
"runId": "signum-2026-03-04-a7f3c1",
"decision": "AUTO_OK",
"confidence": { "overall": 87 },
"auditChain": {
"contractSha256": "e3b0c44298fc1c14...",
"approvedAt": "2026-03-04T14:01:12Z",
"baseCommit": "8a4f2dc"
},
"contract": {
"sha256": "a1b2c3d4...",
"fullSha256": "f5e6d7c8...",
"status": "present"
},
"diff": {
"sha256": "9f8e7d6c...",
"sizeBytes": 4820,
"status": "present"
},
"checks": {
"mechanic": { "status": "present" },
"holdout": { "status": "present" },
"reviews": {
"claude": { "status": "present" },
"codex": { "status": "present" },
"gemini": { "status": "present" }
}
}
}
Два хэша для контракта - sha256 (редактированная версия без holdout-критериев) и fullSha256 (оригинал). Базовый коммит зафиксирован до начала реализации. Три независимых ревью. Holdout-результаты - отдельно, потому что инженер их не видел.
CI гейтит на этом:
DECISION=$(jq -r '.decision' .signum/proofpack.json)
if [ "$DECISION" != "AUTO_OK" ]; then
echo "Signum: $DECISION - блокирую merge"
exit 1
fi
Не нужно парсить логи трёх моделей. Один файл, одно поле, детерминированный гейт.
Сломанное настоящее
Индустрия AI code review сейчас работает на одном уровне - diff. Модель смотрит на патч и говорит, что думает. Проблема не в качестве моделей, а в отсутствии определения “корректно”.
CodeRabbit в своих собственных замерах1 показывает 46% полезных комментариев. Copilot Code Review в тесте на 117 файлах с известными уязвимостями не нашёл ни одной security-проблемы2. Это не обвинение конкретных инструментов - это следствие архитектуры: ревью без контракта ограничено тем, что ревьюер считает “разумным”.
Проблема глубже. Даже если модель находит баг, результат - комментарий в PR. Не машиночитаемый артефакт, не цепочка верификации, не что-то, на чём CI может строить гейт. Между “модель оставила комментарий” и “код верифицирован” - пропасть.
Четыре слоя: как собирается proofpack
В предыдущем посте я разбирал контракт как точку истины. Здесь - как четыре слоя вместе создают верифицируемый артефакт.
CONTRACT. Спецификация формализуется до начала реализации. Оценивается по 6 измерениям (A-F). Codex и Gemini валидируют на пробелы. Генерируются holdout-сценарии - скрытые критерии приёмки, которые инженер не увидит.
EXECUTE. Инженер работает с contract-engineer.json, из которого holdout-критерии физически удалены - не спрятаны инструкцией, а убраны из файла. Baseline (lint, typecheck, имена тестов) зафиксирован до первой строки кода.
AUDIT. Механик - детерминированные проверки без LLM: линтер, тайпчекер, новые провалы тестов по имени (не по exit code). Затем Claude, Codex и Gemini проверяют diff независимо, параллельно, не видя оценок друг друга. Holdout-критерии запускаются против результата. Синтезатор агрегирует: детерминированная политика + confidence score.
PACK. Все артефакты встраиваются в proofpack.json. SHA-256 связывает: одобренный контракт → временная метка → базовый коммит → diff → результаты аудита. Это не лог - это attestation.
Ключевые решения:
- Ослепление на уровне данных, не инструкций. Инженер не может вывести holdout-критерии из контекста или структуры файла.
- Мультимодельный аудит: 3 вендора, 3 независимые оценки. Не одна модель проверяет саму себя.
- Воспроизводимые артефакты для человека и CI, а не доверие к суждению модели. Proofpack существует как файл, его можно проверить, архивировать, подвергнуть аудиту.
Модель угроз: что proofpack защищает и что нет
Защищает:
- Реализация не соответствует спецификации → holdout-критерии поймают
- Rubber-stamp ревью (одна модель проверяет саму себя) → 3 независимых ревьюера
- Нет аудиторского следа → SHA-256 цепочка с временными метками
- Оптимизация под известные тесты → data-level blinding
Не защищает:
- Плохая спецификация. Garbage in - verified garbage out. Гейт качества (A-F) снижает риск, но не устраняет.
- Сговор моделей. Теоретически возможен. 3 вендора (Anthropic, OpenAI, Google) смягчают, но не исключают.
- Формальная корректность. Proofpack - это целостность процесса, не математическое доказательство. SLSA тоже не доказывает отсутствие багов - доказывает, что билд не был подменён.
- Злонамеренный автор спецификации. Если человек намеренно прячет требования, система не поможет.
Точнее: proofpack - не proof of correctness, а proof of process. Разница принципиальная.
Смежные работы
| Фреймворк | Что делает | Пробел |
|---|---|---|
| SLSA | Attestation провенанса сборки | Не знает про AI-кодогенерацию |
| in-toto | Layout цепочки поставок ПО | Только этап сборки, нет spec → code |
| Sigstore | Подпись кода + transparency log | Идентичность, не корректность |
| CodeRabbit | AI-ревью diff | Нет контракта, holdouts, proof artifact |
| Copilot Code Review | AI-ревью PR | Diff-уровень, одна модель |
| Qodo | AI-тестирование + compliance | Ближе, но без мультимодельного аудита и proofpack |
| GitHub Spec Kit | Спецификация как вход для Copilot | Spec → code, но без цикла верификации |
Что действительно ново: цепочка из четырёх слоёв - от спецификации через ослеплённое выполнение и состязательный аудит до tamper-evident артефакта. Ни один существующий инструмент не соединяет все четыре.
Proof artifacts - недостающий примитив
Индустрия software supply chain потратила годы на то, чтобы билды стали верифицируемыми. SLSA, in-toto, Sigstore - всё это про одно: не доверяй, верифицируй, и оставляй артефакт для аудита.
AI-кодогенерация пока обходится без этого. Модель пишет код, другая модель оставляет комментарий в PR, человек нажимает merge. Ничего машиночитаемого не остаётся. Proofpack - одна реализация; паттерн важнее инструмента.
Ссылки
- signum на GitHub
- Контракт - это контекст - предыдущий пост
- SLSA specification
- in-toto framework
- Sigstore
Footnotes
-
CodeRabbit, “How We Measure Review Quality”, 2025. Self-reported metric из их блога. ↩
-
Исследование Copilot Code Review на проекте с 117 файлами, содержащими известные уязвимости (SQL injection, XSS, command injection). Ни одна из уязвимостей не была отмечена. Результат зависит от конфигурации и выборки. ↩