Короткий ответ
#Как устроен файл
- Evidence Package
- Один JSON-документ, произведённый одним анализом. У него есть версия схемы и версия протокола, он привязан к одному заданию на сканирование и несёт девять разделов, которые вместе описывают систему и уверенность, с которой держится каждая часть этого описания.
- Если проще Файл, который пишет ваш кодовый агент: структурированное описание системы, где под каждым утверждением стоит ссылка на источник.
{
"schema": "1adk.evidence-package/1",
"protocol_version": "1",
"scan_job_id": "…",
"generated_by": { "agent": "claude-code", "version": "…" },
"source": { "kind": "AGENT_SCAN", "title": "Static scan", "revision": "9f3c1a2" },
"coverage": [ … ],
"limitations": [ … ],
"entities": [ … ],
"structure": [ … ],
"relations": [ … ],
"interfaces": [ … ],
"data_objects": [ … ],
"representations":[ … ],
"data_flows": [ … ],
"mappings": [ … ],
"evidence": [ … ],
"claims": [ … ],
"unknowns": [ … ]
}
source.revision — это коммит, на котором читали. Без него пакет
описывает систему ни в какой конкретный момент, и два пакета невозможно
осмысленно выстроить по порядку.
#Зачем нужен каждый раздел
| Раздел | Что в нём |
|---|---|
coverage | По строке на каждую просмотренную область, со статусом — полностью, частично, не покрыто, неизвестно — и с тем, что исключили намеренно. Именно это позволяет отличить «удалено» от «не смотрели». |
limitations | Обычные фразы о том, чего этот анализ не смог установить вообще. |
entities | То, из чего система состоит. У каждой сущности — локальный для пакета ключ, канонический тип, имя и описание, написанное для непрограммиста. |
structure | Вложенность: что в чём лежит, в одном из пяти представлений — приложение, бизнес, организация, развёртывание, данные. |
relations | Смысл: использует, зависит от, читает из, пишет в, реализует, принадлежит — и остальные. |
interfaces | Как две вещи разговаривают: у каждого интерфейса читаемое назначение и набор операций. |
data_objects, representations, data_flows, mappings | Что такое бизнес-данные, в каких формах они существуют, куда они движутся и что с ними по дороге происходит. |
evidence | Откуда взялась находка: путь, символ, диапазон строк, короткая сводка. Никогда — сам код. |
claims | Утверждение об одной вещи, с перспективой — наблюдено, заявлено, выведено — и ключами доказательств, которые за ним стоят. |
unknowns | Каждый вопрос, на который придётся ответить человеку, с объяснением, почему это важно, и приоритетом: низкий, средний, высокий. |
Приоритета выше «высокого» намеренно нет. То, что срочнее, — это риск, о котором один человек говорит другому, а не строка в сгенерированном файле.
#Идентичность и почему её требуют явно
Самое дальнобойное требование во всём формате.
От каждой сущности требуется что-то устойчивое, по чему её можно будет узнать в следующем анализе:
repository_path— где лежит файл или каталог, относительно корня;fully_qualified_name— однозначное имя в терминах самого языка;external_id— выбранная и сохранённая метка для того, у чего нет ни первого, ни второго: базы, очереди, среды развёртывания, облачного ресурса.
Имя — это не идентичность. Переименуйте класс — это тот же класс; назовите две разные вещи «Основная база» — это по-прежнему две разные вещи. Сущность, у которой нет ни одного из трёх, для каждого анализа новая, и её история каждый раз начинается заново.
Снимки и изменения — о том, что построено поверх этого, и почему именно эта часть решает, способен ли инструмент вообще следить за архитектурой во времени.
#Поведение и алгоритмы
У операции на интерфейсе могут быть ещё две вещи, и обе существуют из-за одной и той же проблемы: знание, что эндпоинт есть, почти ничего не говорит о том, безопасно ли на него опираться.
- Поведение — аутентификация, авторизация, таймаут, повторы, идемпотентность. Пять свойств, которые владельцу нужны на самом деле, когда он спрашивает «а что будет, если это упадёт».
- Алгоритм — вложенные шаги, описывающие, что операция делает: проверить, условие, записать, отказать, вызвать. Не псевдокод и не переписывание кода, а читаемый рассказ о принимаемых решениях.
"algorithm": {
"name": "Create payment",
"steps": [
{ "type": "VALIDATE", "description": "The amount and the currency are checked." },
{ "type": "CONDITION", "condition": "the amount is above the limit",
"children": [ { "type": "FAIL", "description": "The request is refused." } ] },
{ "type": "WRITE", "description": "A payment row is created." }
]
}
Три шага в форме, которую прочитает непрограммист, отвечающие на вопрос, на который схема архитектуры ответить не может: что происходит, когда сумма слишком велика.
#Для чего в формате нет поля
Пустоты здесь и есть конструкция.
- Содержимое файлов. Нет поля, в которое могло бы поместиться тело функции.
- Значения конфигурации. Имя настройки появиться может; её значению жить негде.
- Данные. Ни строк, ни дампов, ни SQL, ни фикстур.
- Абсолютные пути. Запрещены инструкцией и бессмысленны в схеме, у которой корень — корень репозитория.
- Учётные данные. Поля нет, а свободный текст, несущий формы секретов, отклоняется на входе.
Инструкция подпирает это с другой стороны: описания должны быть обычными фразами, а не отформатированным выводом, и поле, которое читается как исходник, отклоняется вместе со всем пакетом. Между схемой, куда код положить некуда, и валидатором, отвергающим текст в форме кода, вставить тело файла без сознательного обхода обоих непрактично.
#Что происходит с пакетом, нарушившим правило
Ему отказывают целиком. Нет ни частичного приёма, ни «хорошее мы оставили», ни карантина с починкой: пакет, не прошедший проверку, не записывает ничего, и хранилище проекта остаётся нетронутым.
Причины, по которым пакету отказывают:
- он не соответствует схеме или объявляет версию, которую сервер не обслуживает;
- он превышает предел размера, указанный в его же задании;
- он заявляет задание, под которое не был выдан, или задание с истёкшим сроком;
- он ссылается на ключ, которого сам не объявляет;
- его свободный текст несёт форму учётных данных.
#Пределы формата
Чего это не делает
- Он фиксирует структуру и поведение, но не намерение. Поля «почему так решили» нет, потому что анализ этого не восстанавливает.
- В нём нет оценки качества. Ни метрики сложности, ни рейтинга, ни мнения о том, должен ли компонент существовать.
- Он описывает один анализ на одном коммите. Всё, что касается изменений, живёт в сравнении двух пакетов, а не внутри одного.
- Он полон ровно настолько, насколько полон произведший его анализ, — именно поэтому охват обязателен, а не подразумевается.
- Машиночитаемая схема не опубликована. Публиковать ли её — отдельное продуктовое решение, которое пока не принято.