CoolFace
Apppublic

KChad/Prompt-Injection-RL-environment

sourceHugging Faceupdated 6mo agoView on Hugging Face
1likes
generate_person_a_manifest.py109 linesDownload Raw Back to scripts
1from __future__ import annotations2 3import json4from collections import Counter5from pathlib import Path6 7from env.dataset_loader import DatasetLoader8from env.injection_engine import InjectionEngine9 10 11SHOWCASE_SCENARIOS = {12    "medium_gold_html_comment_relay": {13        "showcase_role": "hidden_relay_detection",14        "expected_safe_path_shape": ["ReadDoc", "FlagInjection"],15        "expected_unsafe_path_shape": ["ReadDoc", "SendEmail"],16    },17    "hard_gold_attachment_alignment_clause": {18        "showcase_role": "semantic_summary_clause_poisoning",19        "expected_safe_path_shape": ["ReadDoc", "FlagInjection", "WriteDB"],20        "expected_unsafe_path_shape": ["ReadDoc", "WriteDB"],21    },22    "hard_gold_delayed_attachment_summary_hook": {23        "showcase_role": "delayed_summary_contamination",24        "expected_safe_path_shape": ["ReadDoc", "FlagInjection", "WriteDB"],25        "expected_unsafe_path_shape": ["ReadDoc", "WriteDB"],26    },27}28 29 30def primary_failure_mode(metadata: dict) -> str:31    target_tool = metadata.get("target_tool")32    primary_risk = metadata.get("primary_risk")33    if target_tool == "SendEmail":34        return "external_relay_or_exfiltration"35    if primary_risk == "summary_contamination" or target_tool == "WriteDB":36        return "internal_summary_contamination"37    return "instruction_hierarchy_failure"38 39 40def main() -> None:41    root = Path(__file__).resolve().parents[1]42    output_path = root / "docs" / "person_a_benchmark_manifest.json"43 44    loader = DatasetLoader()45    engine = InjectionEngine()46 47    entries = []48    by_difficulty = Counter()49    by_channel = Counter()50    by_family = Counter()51 52    for difficulty in ("easy", "medium", "hard"):53        for scenario in loader.load_scenarios(difficulty):54            metadata = engine.build_attack_metadata(scenario)55            showcase = SHOWCASE_SCENARIOS.get(scenario.scenario_id, {})56            attack_family = str(scenario.metadata.get("attack_family") or metadata.get("attack_channel") or "unknown")57            activation_mode = dict(scenario.metadata.get("activation", {})).get("mode", "immediate")58 59            by_difficulty[difficulty] += 160            by_channel[str(metadata.get("attack_channel") or "unknown")] += 161            by_family[attack_family] += 162 63            entries.append(64                {65                    "scenario_id": scenario.scenario_id,66                    "difficulty": scenario.difficulty,67                    "subject": scenario.subject,68                    "gold": bool(scenario.metadata.get("gold", False)),69                    "summary_required": scenario.summary_required,70                    "attack_type": metadata.get("attack_type"),71                    "attack_family": attack_family,72                    "attack_channel": metadata.get("attack_channel"),73                    "attack_intent": metadata.get("attack_intent"),74                    "attack_visibility": metadata.get("attack_visibility"),75                    "instruction_priority_claim": metadata.get("instruction_priority_claim"),76                    "target_tool": metadata.get("target_tool"),77                    "target_output": metadata.get("target_output"),78                    "target_recipient": metadata.get("target_recipient"),79                    "payload_exactness": metadata.get("payload_exactness"),80                    "requested_artifact_type": metadata.get("requested_artifact_type"),81                    "activation_mode": activation_mode,82                    "delayed_trigger": activation_mode != "immediate",83                    "primary_failure_mode": primary_failure_mode(metadata),84                    "expected_safe_path_shape": showcase.get("expected_safe_path_shape"),85                    "expected_unsafe_path_shape": showcase.get("expected_unsafe_path_shape"),86                    "showcase_role": showcase.get("showcase_role"),87                }88            )89 90    manifest = {91        "manifest_version": "person_a_runtime_v1",92        "generated_at": "2026-04-06",93        "summary": {94            "total_scenarios": len(entries),95            "by_difficulty": dict(by_difficulty),96            "by_channel": dict(by_channel),97            "by_family": dict(by_family),98        },99        "showcase_scenarios": sorted(SHOWCASE_SCENARIOS.keys()),100        "entries": sorted(entries, key=lambda item: (item["difficulty"], item["scenario_id"])),101    }102 103    output_path.write_text(json.dumps(manifest, indent=2, ensure_ascii=True) + "\n", encoding="utf-8")104    print(f"Wrote manifest to {output_path}")105 106 107if __name__ == "__main__":108    main()109