Протокол

Что такое Evidence Package?

Один файл. Девять разделов. И ни одного поля, куда мог бы попасть исходный код.

Короткий ответ

Evidence Package — это один JSON-файл, описывающий один анализ одной системы. В нём: сущности, из которых система состоит; кто в ком лежит; как они связаны; интерфейсы между ними; данные, которые они хранят и передают; утверждения о них; доказательство под каждым утверждением; вопросы, на которые ответить не удалось; и запись о том, что было и что не было просмотрено. Ключи локальны для файла, и всё, на что он ссылается, должно быть в нём же объявлено.

#Как устроен файл

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 — это коммит, на котором читали. Без него пакет описывает систему ни в какой конкретный момент, и два пакета невозможно осмысленно выстроить по порядку.

#Зачем нужен каждый раздел

Разделы Evidence Package
РазделЧто в нём
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, ни фикстур.
  • Абсолютные пути. Запрещены инструкцией и бессмысленны в схеме, у которой корень — корень репозитория.
  • Учётные данные. Поля нет, а свободный текст, несущий формы секретов, отклоняется на входе.

Инструкция подпирает это с другой стороны: описания должны быть обычными фразами, а не отформатированным выводом, и поле, которое читается как исходник, отклоняется вместе со всем пакетом. Между схемой, куда код положить некуда, и валидатором, отвергающим текст в форме кода, вставить тело файла без сознательного обхода обоих непрактично.

#Что происходит с пакетом, нарушившим правило

Ему отказывают целиком. Нет ни частичного приёма, ни «хорошее мы оставили», ни карантина с починкой: пакет, не прошедший проверку, не записывает ничего, и хранилище проекта остаётся нетронутым.

Причины, по которым пакету отказывают:

  • он не соответствует схеме или объявляет версию, которую сервер не обслуживает;
  • он превышает предел размера, указанный в его же задании;
  • он заявляет задание, под которое не был выдан, или задание с истёкшим сроком;
  • он ссылается на ключ, которого сам не объявляет;
  • его свободный текст несёт форму учётных данных.

#Пределы формата

Чего это не делает

  • Он фиксирует структуру и поведение, но не намерение. Поля «почему так решили» нет, потому что анализ этого не восстанавливает.
  • В нём нет оценки качества. Ни метрики сложности, ни рейтинга, ни мнения о том, должен ли компонент существовать.
  • Он описывает один анализ на одном коммите. Всё, что касается изменений, живёт в сравнении двух пакетов, а не внутри одного.
  • Он полон ровно настолько, насколько полон произведший его анализ, — именно поэтому охват обязателен, а не подразумевается.
  • Машиночитаемая схема не опубликована. Публиковать ли её — отдельное продуктовое решение, которое пока не принято.

Посмотрите полный пакет, поле за полем.

В демонстрации метаданных разобран целый пример: что уходит, что не уходит никогда, и честный раздел о том, где метаданные всё-таки могут оказаться чувствительными.

Открыть демонстрацию метаданных Построить карту проекта — бесплатно