
Стенд для воспроизведения, патчи и инструменты анализа для аудита обученного бенчмарка киберзащиты: фиксирует трассировки агентов, запускает абляции red-агента и пересчитывает каждый рисунок из статьи на основе опубликованных данных.
Этот репозиторий — это стенд, патчи, инструменты анализа и реестр, лежащие в основе статьи What a CAGE 4 Score Measures: An Audit of a Learned Cyber-Defense Benchmark, Its Reference Defenders, and the Tables Built on Them (James M. Rice и консультанты, Rochester Institute of Technology, 2026). Идентификатор arXiv добавляется здесь в первом коммите после публикации. Тег arxiv-v1 — это состояние, из которого вычислено каждое число в опубликованной статье.
Трассы и контрольные точки, из которых вычислены числа статьи, размещены отдельно по адресу https://doi.org/10.5281/zenodo.23681828 в четырёх архивах.
| Архив | Содержимое | Распаковать в | sha256 |
|---|---|---|---|
traces_arms_arxiv-v1.tar.zst | пошаговые записи каждого плеча оценки основного аудита — 123 плеча, перечисленных в Приложении B статьи, и диагностических плеч, названных в ARMS.md; одна директория на плечо, один файл JSON-lines на эпизод | data/traces/ | db2c3d17684180e5d4ca7fb9a7f1f739b5414e62da0e8c4b9b792cd31568f456 |
traces_pilot_arxiv-v1.tar.zst | пошаговые записи пилота busy-check и его продолжения (плечи с именами kbf_*) | data/traces/ | ece72ca24d17bf688144b2d0276ae9f0209aa8a50f95ecdd0aab9a6f8a9c0fc0 |
checkpoints_pilot_arxiv-v1.tar.zst | сохранённые контрольные точки и состояние возобновления обучающих прогонов пилота и продолжения | repos/cage-4-submission/checkpoints/ | dc2c8219e12a0c2931263be0003c8858039931b04b019e1bfa60c0ba6856c07e |
checkpoints_continuation_arxiv-v1.tar.zst | контрольные точки прогонов продолжения Wrecker из раздела 5 | repos/cage-4-submission/checkpoints/ | в SHA256SUMS |
run_logs_arxiv-v1.tar.zst | журналы обучения и оценки прогонов пилота и продолжения с обеих машин, включая pilot_runs.log, в котором записаны хост, число потоков, число воркеров, дайджест кода и образ для каждого прогона | data/ | в SHA256SUMS |
SHA256SUMS в депозите перечисляет все четыре. Перед распаковкой проверьте архив командой sha256sum -c SHA256SUMS.
| Путь | Что это |
|---|---|
bin/run | запускает команду в одном из двух образов с этой директорией, смонтированной в /work, передавая переключатели KEEP_* и HMARL_*. Ожидает клон в ~/cage. |
build/ | два Dockerfile (Dockerfile.keep, Dockerfile.marl) и патчи, применяемые к вышестоящим репозиториям перед сборкой образов |
scripts/capture.py | запускает выпущенную политику KEEP на парных сидах окружения и записывает пошаговый журнал с сырыми наблюдениями агентов и истинным состоянием симулятора |
scripts/capture_hmarl.py | то же самое для H-MARL Expert, через путь оценки авторов (--compat) или через надзорный стенд |
scripts/oracle.py, scripts/oracle_rules.py | надзорный стенд на KEEP, правила O1–O15 и защитники правил, с переключателями доставки (--wait-busy, --queue, --min-gap) |
red_agents/ | противники, которых статья запускает помимо штатного FiniteStateRedAgent. Wrecker и его лестницы Pn и Qn — собственные разработки статьи (раздел 2), и bin/run копирует каждый файл отсюда в директорию SimpleAgents образа при запуске |
tools_*.py | инструменты анализа. tools_paired.py (парная разность, бутстрэп-интервал, победы, знаковый тест), tools_charge.py и tools_busy_charge.py (заряд Restore и остальное), tools_dropped.py (выполняется против заявленных вмешательств), tools_cont.py, tools_ceiling.py, tools_fraction_ci.py, tools_latch_sum.py, tools_drawspread.py, tools_lagcorr.py, tools_busy_restores.py, tools_pilot_decisions.py и остальные. Каждый выводит то, что вычисляет, из директории трассировки в data/traces/ |
tools_patch_*.py | стек патчей на выпущенном коде. tools_patch_keep_busy.py, tools_patch_keep_seedmode.py и tools_patch_keep_readall.py в этом порядке дают тренеру KEEP переключатели из раздела 6. tools_patch_hmarl_busy.py даёт обёртке H-MARL переключатель HMARL_BUSY=none. tools_patch_oracle_truth.py добавляет --log-truth в стенд. Каждый идемпотентен и отказывается работать с кодом, который не распознаёт |
run_keep_pilot.sh, eval_keep_pilot.sh, pilot_status.sh, test_keep_*.sh | пилот и продолжение из раздела 6, их оценка и их тесты |
run_busy_reds.sh | выпущенная политика KEEP с включённой и выключенной проверкой занятости на штатном противнике и девяти других (раздел 6.1) |
queue_*.sh, read_*.sh, run_*.sh, rerun_F.sh, gate_O15.sh, pilot_O15.sh, svy_O15.sh | лаунчеры и читатели кампании. Каждое плечо в статье было запущено одним из них, поэтому они являются записью точного вызова каждого плеча |
ARMS.md | каждое плечо, по имени, с его командой, его средним и файлом, в котором оно хранится |
RESULTS.md | датированный журнал работы, сначала новые записи |
papers/ | артефактная копия аналитического слоя статьи, без текста статьи. papers/paper1/ledger.csv — это реестр, одна строка на каждое число, напечатанное в статье, с командой, которая его пересчитывает. papers/paper1/fig/ содержит скрипты для рисунков и таблиц. papers/paper1/check_identities.py проверяет арифметические тождества, которым должна удовлетворять каждая сборка. Скрипты recompute_*.py и means.py в papers/ — это вычисления критерия, дисперсии и доли, которые вызывает реестр |
Всё под data/ и repos/ игнорируется git. Трассировки находятся в data/traces/, вышестоящие репозитории и контрольные точки — в repos/.
Приложение A статьи называет три уровня. Им требуется всё больше и больше окружения.
Клонируйте, распакуйте два архива трассировок в data/traces/ и запустите пересчёт из корня репозитория. Он выполняет каждую отдельную команду из реестра из этой директории и проверяет, что сохранённое значение каждой строки появляется в выводе этой команды.
git clone https://github.com/jrice-ai/cage ~/cage && cd ~/cage && git checkout arxiv-v1
mkdir -p data/traces && tar -I zstd -xf traces_arms_arxiv-v1.tar.zst -C data/traces && tar -I zstd -xf traces_pilot_arxiv-v1.tar.zst -C data/traces
./recompute.sh
python3 papers/paper1/check_identities.py papers/paper1/ledger.csv
Команды реестра обращаются к слою анализа по его пути на машине авторов, ~/papers, поэтому recompute.sh запускает проверку с HOME, указывающим на временный каталог, в котором papers/ связан с этим местом. Ничего не записывается за пределами репозитория. На ноутбуке полный пересчёт занимает десятки минут, большая часть которых приходится на пилотные ветви. Десять строк, гиперпараметры которых считываются из выпущенных контрольных точек (ключи keep* и trident*, запускаемые через bin/run), требуют образа уровня 2 и без него сообщаются как не найденные. check_identities.py сообщает об арифметических тождествах (стоимость равна начислению плюс остаток для каждого разбиения, интервалы четырёх выборок и четырёх сидов относительно их средних и стандартных отклонений, нулевой остаток пары H-MARL с отключённой маской). Скрипты построения графиков и таблиц в papers/paper1/fig/ заново генерируют графики и таблицы статьи из тех же трассировок с помощью CAGE=~/cage python3 papers/paper1/fig/fig_curves.py и аналогично для fig_drop.py, fig_noise.py, make_tables.py, make_busyreds.py и make_arms.py.
Для этого нужны два образа, вышестоящие репозитории на их закреплённых ревизиях и выпущенные контрольные точки.
Клонируйте три вышестоящих репозитория в repos/ на ревизиях, на которых вычислялась статья, то есть на ревизиях, которые печатает Таблица 12 статьи.