
Harnais de reproduction, correctifs et outils d'analyse pour auditer un benchmark de cyberdéfense basé sur l'apprentissage : capture les traces d'agents, exécute des ablations d'agents rouges et recalcule chaque figure de l'article à partir des données publiées.
Ce dépôt est le harnais, les correctifs, les outils d'analyse et le registre derrière l'article 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 et conseillers, Rochester Institute of Technology, 2026). L'identifiant arXiv est ajouté ici dans le premier commit après publication. Le tag arxiv-v1 correspond à l'état à partir duquel chaque chiffre de l'article publié a été calculé.
Les traces et les checkpoints à partir desquels les chiffres de l'article sont calculés sont déposés séparément, à l'adresse https://doi.org/10.5281/zenodo.23681828, dans quatre archives.
| Archive | Contenu | À décompresser dans | sha256 |
|---|---|---|---|
traces_arms_arxiv-v1.tar.zst | les enregistrements d'étapes de chaque bras d'évaluation de l'audit principal, les 123 que liste l'annexe B de l'article et les bras de diagnostic nommés par ARMS.md, un répertoire par bras, un fichier JSON-lines par épisode | data/traces/ | db2c3d17684180e5d4ca7fb9a7f1f739b5414e62da0e8c4b9b792cd31568f456 |
traces_pilot_arxiv-v1.tar.zst | les enregistrements d'étapes du pilote de vérification de charge et de sa continuation (bras nommés kbf_*) | data/traces/ | ece72ca24d17bf688144b2d0276ae9f0209aa8a50f95ecdd0aab9a6f8a9c0fc0 |
checkpoints_pilot_arxiv-v1.tar.zst | les checkpoints conservés et l'état de reprise des exécutions d'entraînement du pilote et de la continuation | repos/cage-4-submission/checkpoints/ | dc2c8219e12a0c2931263be0003c8858039931b04b019e1bfa60c0ba6856c07e |
checkpoints_continuation_arxiv-v1.tar.zst | les checkpoints des exécutions de continuation Wrecker de la section 5 | repos/cage-4-submission/checkpoints/ | dans SHA256SUMS |
run_logs_arxiv-v1.tar.zst | les journaux d'entraînement et d'évaluation des exécutions du pilote et de la continuation depuis les deux machines, avec pilot_runs.log, qui consigne pour chaque exécution l'hôte, le nombre de threads, le nombre de workers, le digest du code et l'image | data/ | dans SHA256SUMS |
SHA256SUMS dans le dépôt les liste tous les quatre. Vérifiez une archive avec sha256sum -c SHA256SUMS avant de la décompresser.
| Chemin | Ce que c'est |
|---|---|
bin/run | exécute une commande dans l'une des deux images avec ce répertoire monté sur /work, en transmettant les commutateurs KEEP_* et HMARL_*. Il attend le clone à ~/cage. |
build/ | les deux Dockerfiles (Dockerfile.keep, Dockerfile.marl) et les patches appliqués aux dépôts upstream avant la construction des images |
scripts/capture.py | exécute la politique publiée de KEEP sur des seeds d'environnement appariées et écrit l'enregistrement des pas avec les observations brutes des agents et l'état réel du simulateur |
scripts/capture_hmarl.py | idem pour H-MARL Expert, via le chemin d'évaluation des auteurs (--compat) ou via le harnais de supervision |
scripts/oracle.py, scripts/oracle_rules.py | le harnais de supervision sur KEEP, les règles O1 à O15 et les défenseurs de règles, avec les commutateurs de livraison (--wait-busy, --queue, --min-gap) |
red_agents/ | les adversaires que l'article exécute au-delà du FiniteStateRedAgent standard. Wrecker et ses échelles Pn et Qn sont propres à l'article (Section 2), et bin/run copie chaque fichier de ce répertoire dans le répertoire SimpleAgents de l'image au lancement |
tools_*.py | les outils d'analyse. tools_paired.py (différence appariée, intervalle bootstrap, victoires, test du signe), tools_charge.py et tools_busy_charge.py (la charge Restore et le reste), tools_dropped.py (exécuté contre des interventions assertées), 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 et les autres. Chacun affiche ce qu'il calcule à partir d'un répertoire de traces sous data/traces/ |
tools_patch_*.py | la pile de patches sur le code publié. tools_patch_keep_busy.py, tools_patch_keep_seedmode.py et tools_patch_keep_readall.py, dans cet ordre, donnent au trainer de KEEP les commutateurs de la Section 6. tools_patch_hmarl_busy.py donne au wrapper de H-MARL le commutateur HMARL_BUSY=none. tools_patch_oracle_truth.py ajoute --log-truth au harnais. Chacun est idempotent et refuse de s'exécuter sur du code qu'il ne reconnaît pas |
run_keep_pilot.sh, eval_keep_pilot.sh, pilot_status.sh, test_keep_*.sh | le pilote et la continuation de la Section 6, leur évaluation et leurs tests |
run_busy_reds.sh | la politique KEEP publiée avec sa vérification busy activée et désactivée sur l'adversaire standard et neuf autres (Section 6.1) |
queue_*.sh, read_*.sh, run_*.sh, rerun_F.sh, gate_O15.sh, pilot_O15.sh, svy_O15.sh | les lanceurs et lecteurs de campagne. Chaque bras de l'article a été lancé par l'un de ces scripts, ils constituent donc l'enregistrement de l'invocation exacte de chaque bras |
ARMS.md | chaque bras, par nom, avec sa commande, sa moyenne et le fichier qui la contient |
RESULTS.md | le journal daté du travail, du plus récent au plus ancien |
papers/ | la copie d'artefact de la couche d'analyse de l'article, sans le texte de l'article. papers/paper1/ledger.csv est le registre, une ligne par nombre imprimé dans l'article, avec la commande qui le recalcule. papers/paper1/fig/ contient les scripts des figures et des tableaux. papers/paper1/check_identities.py teste les identités arithmétiques que chaque build doit satisfaire. Les scripts recompute_*.py et means.py sous papers/ sont les calculs de critère, de variance et de part que le registre appelle |
Tout ce qui se trouve sous data/ et repos/ est ignoré par git. Les traces vont sous data/traces/, les dépôts upstream et les checkpoints sous repos/.
L'Annexe A de l'article nomme trois niveaux. Ils nécessitent de plus en plus de l'environnement.
Clonez, décompressez les deux archives de traces dans data/traces/, et exécutez le recalcul depuis la racine du dépôt. Il exécute chaque commande distincte du registre depuis ce répertoire et vérifie que la valeur stockée de chaque ligne apparaît dans la sortie de cette commande.
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