ledgershield-controlbench / server /benchmark_contract.py
shreayas's picture
Upload LedgerShield ControlBench with TRL training evidence
befd2b8 verified
Raw
History Blame Contribute Delete
16.9 kB
from __future__ import annotations
from copy import deepcopy
from typing import Any
from .schema import normalize_text
CASE_TRACK = "case"
PORTFOLIO_TRACK = "portfolio"
ADVERSARIAL_DATA_TRACK = "adversarial"
CONTROLBENCH_TRACK = "controlbench"
CERTIFICATE_REQUIRED_TRACK = "certificate_required"
GENERATED_HOLDOUT_TRACK = "generated_holdout"
SLEEPER_VIGILANCE_TRACK = "sleeper_vigilance"
BLIND_CONTROL_TRACK = "blind_control"
HUMAN_BASELINE_TRACK = "human_baseline"
OFFICIAL_TRACKS = {
CASE_TRACK: {
"label": "Case Track",
"description": "Single-case control performance under enterprise AP controls.",
},
PORTFOLIO_TRACK: {
"label": "Portfolio Track",
"description": "Persistent AP-week performance with institutional memory and capacity tradeoffs.",
},
ADVERSARIAL_DATA_TRACK: {
"label": "Adversarial Data Track",
"description": "Robustness to deceptive content inside emails, documents, and tool outputs.",
},
CONTROLBENCH_TRACK: {
"label": "ControlBench Track",
"description": "Long-horizon institutional-control evaluation with loss surface, calibration gate, and sleeper-vendor vigilance.",
},
CERTIFICATE_REQUIRED_TRACK: {
"label": "Certificate-Required Track",
"description": "Strict proof-carrying evaluation where auto-generated compatibility certificates cannot receive full credit.",
},
GENERATED_HOLDOUT_TRACK: {
"label": "Generated Holdout Track",
"description": "Seeded generated AP holdouts that stress unseen mechanism combinations and anti-overfit robustness.",
},
SLEEPER_VIGILANCE_TRACK: {
"label": "Sleeper-Vigilance Track",
"description": "Trust-building vendor sequences that later activate bank-change or BEC fraud.",
},
BLIND_CONTROL_TRACK: {
"label": "Blind-Control Track",
"description": "Benchmark runs where SPRT, VoI, and reward-machine scaffolding remain hidden from the acting agent.",
},
HUMAN_BASELINE_TRACK: {
"label": "Human-Baseline Track",
"description": "Comparable AP-analyst evaluations used as an operational realism and calibration anchor.",
},
}
LATENT_MECHANISM_FIELDS = (
"attack_family",
"compromise_channel",
"pressure_profile",
"control_weakness",
"vendor_history_state",
"bank_adjustment_state",
"campaign_linkage",
"portfolio_context",
)
RESULT_CLASSES = {
"valid_success",
"correct_but_policy_incomplete",
"unsafe_release",
"authority_gate_failed",
"control_boundary_failed",
"falsifier_blocked",
"unsupported_certificate",
"certificate_required_missing",
"certificate_gate_failed",
"malformed_submission",
"false_positive_overcontrol",
"incorrect_resolution",
}
def normalize_track(track: str | None) -> str:
candidate = normalize_text(track)
aliases = {
"case_track": CASE_TRACK,
"case": CASE_TRACK,
"portfolio_track": PORTFOLIO_TRACK,
"portfolio": PORTFOLIO_TRACK,
"adversarial_track": ADVERSARIAL_DATA_TRACK,
"adversarial_data_track": ADVERSARIAL_DATA_TRACK,
"adversarial_data": ADVERSARIAL_DATA_TRACK,
"adversarial": ADVERSARIAL_DATA_TRACK,
"controlbench_track": CONTROLBENCH_TRACK,
"controlbench": CONTROLBENCH_TRACK,
"generated_holdout_track": GENERATED_HOLDOUT_TRACK,
"generated_holdout": GENERATED_HOLDOUT_TRACK,
"holdout_track": GENERATED_HOLDOUT_TRACK,
"holdout": GENERATED_HOLDOUT_TRACK,
"sleeper_vigilance_track": SLEEPER_VIGILANCE_TRACK,
"sleeper_vigilance": SLEEPER_VIGILANCE_TRACK,
"blind_control_track": BLIND_CONTROL_TRACK,
"blind_control": BLIND_CONTROL_TRACK,
"blind": BLIND_CONTROL_TRACK,
"institutional_control": CONTROLBENCH_TRACK,
"certificate_required_track": CERTIFICATE_REQUIRED_TRACK,
"certificate_required": CERTIFICATE_REQUIRED_TRACK,
"proof_required": CERTIFICATE_REQUIRED_TRACK,
"human_baseline_track": HUMAN_BASELINE_TRACK,
"human_baseline": HUMAN_BASELINE_TRACK,
"human": HUMAN_BASELINE_TRACK,
}
return aliases.get(candidate, CASE_TRACK)
def track_label(track: str | None) -> str:
normalized = normalize_track(track)
return str(OFFICIAL_TRACKS.get(normalized, OFFICIAL_TRACKS[CASE_TRACK])["label"])
def track_description(track: str | None) -> str:
normalized = normalize_track(track)
return str(OFFICIAL_TRACKS.get(normalized, OFFICIAL_TRACKS[CASE_TRACK])["description"])
def _infer_attack_family(case: dict[str, Any]) -> str:
generator_metadata = case.get("generator_metadata", {}) or {}
attack_category = normalize_text(generator_metadata.get("attack_category"))
if attack_category:
return attack_category
task_type = normalize_text(case.get("task_type"))
gold = case.get("gold", {}) or {}
campaign_signals = {normalize_text(signal) for signal in gold.get("campaign_signals", []) or []}
reason_codes = {normalize_text(code) for code in gold.get("reason_codes", []) or []}
if task_type == "task_e" or campaign_signals & {"shared_bank_account", "coordinated_timing"}:
return "campaign"
if reason_codes & {"bank_override_attempt", "sender_domain_spoof", "vendor_account_takeover_suspected"}:
return "identity"
if reason_codes & {"duplicate_near_match", "approval_threshold_evasion"}:
return "process"
if reason_codes & {"missing_po", "partial_receipt_only", "price_mismatch", "quantity_mismatch", "total_mismatch"}:
return "document"
return "clean"
def _infer_compromise_channel(case: dict[str, Any]) -> str:
documents = case.get("documents", []) or []
doc_types = {normalize_text(doc.get("doc_type")) for doc in documents}
reason_codes = {normalize_text(code) for code in (case.get("gold", {}) or {}).get("reason_codes", []) or []}
if "email" in doc_types and reason_codes & {"sender_domain_spoof", "policy_bypass_attempt", "urgent_payment_pressure"}:
return "email_thread"
if reason_codes & {"bank_override_attempt", "vendor_account_takeover_suspected"}:
return "vendor_master_change"
if reason_codes & {"duplicate_near_match", "approval_threshold_evasion"}:
return "ledger_pattern"
if doc_types & {"invoice", "receipt"}:
return "document_stack"
return "erp_queue"
def _infer_pressure_profile(case: dict[str, Any]) -> str:
campaign_context = case.get("campaign_context", {}) or {}
queue_pressure = normalize_text(campaign_context.get("queue_pressure"))
reason_codes = {normalize_text(code) for code in (case.get("gold", {}) or {}).get("reason_codes", []) or []}
if reason_codes & {"urgent_payment_pressure", "policy_bypass_attempt"}:
return "urgent_override"
if queue_pressure in {"campaign", "elevated", "adversarial"}:
return queue_pressure
if (case.get("gold", {}) or {}).get("unsafe_if_pay"):
return "elevated"
return "routine"
def _infer_control_weakness(case: dict[str, Any]) -> str:
reason_codes = {normalize_text(code) for code in (case.get("gold", {}) or {}).get("reason_codes", []) or []}
task_type = normalize_text(case.get("task_type"))
if reason_codes & {"bank_override_attempt", "vendor_account_takeover_suspected"}:
return "callback_gap"
if reason_codes & {"duplicate_near_match", "approval_threshold_evasion"}:
return "duplicate_control_gap"
if reason_codes & {"policy_bypass_attempt", "sender_domain_spoof"}:
return "workflow_override_gap"
if task_type == "task_b":
return "three_way_match_gap"
if task_type == "task_a":
return "document_extraction_gap"
return "baseline_control"
def _infer_vendor_history_state(case: dict[str, Any]) -> str:
context = case.get("context_overrides", {}) or {}
vendor_history = context.get("vendor_history")
if vendor_history:
flags = {normalize_text(row.get("change_type")) for row in vendor_history if isinstance(row, dict)}
if flags & {"bank_account_change_request", "historical_bank_change_rejected"}:
return "prior_bank_change_anomaly"
return "historical_activity_present"
reason_codes = {normalize_text(code) for code in (case.get("gold", {}) or {}).get("reason_codes", []) or []}
if reason_codes & {"vendor_account_takeover_suspected"}:
return "compromised_history_signal"
return "steady_vendor"
def _infer_bank_adjustment_state(case: dict[str, Any]) -> str:
reason_codes = {normalize_text(code) for code in (case.get("gold", {}) or {}).get("reason_codes", []) or []}
if reason_codes & {"bank_override_attempt", "callback_verification_failed"}:
return "proposed_unverified_change"
if reason_codes & {"shared_bank_account"}:
return "shared_account_pattern"
if (case.get("gold", {}) or {}).get("unsafe_if_pay"):
return "requires_verification"
return "approved_on_file"
def _infer_campaign_linkage(case: dict[str, Any]) -> str:
gold = case.get("gold", {}) or {}
links = list(gold.get("cross_invoice_links", []) or []) + list(gold.get("duplicate_links", []) or [])
campaign_signals = {normalize_text(signal) for signal in gold.get("campaign_signals", []) or []}
if campaign_signals & {"shared_bank_account", "coordinated_timing"}:
return "campaign_linked"
if len(links) >= 2:
return "multi_invoice"
if links:
return "linked_pair"
return "standalone"
def _infer_portfolio_context(case: dict[str, Any]) -> str:
campaign_context = case.get("campaign_context", {}) or {}
queue_pressure = normalize_text(campaign_context.get("queue_pressure"))
linked_invoice_count = int(campaign_context.get("linked_invoice_count", 1) or 1)
if queue_pressure == "campaign" or linked_invoice_count >= 3:
return "campaign_week"
if queue_pressure in {"elevated", "adversarial"} or linked_invoice_count == 2:
return "capacity_stressed"
return "single_queue"
def infer_latent_mechanism(case: dict[str, Any]) -> dict[str, str]:
existing = case.get("latent_mechanism")
if isinstance(existing, dict):
output = {field: normalize_text(existing.get(field)) for field in LATENT_MECHANISM_FIELDS}
else:
output = {}
hints = (case.get("generator_metadata", {}) or {}).get("mechanism_hints", {}) or {}
for field in LATENT_MECHANISM_FIELDS:
hint_value = normalize_text(hints.get(field))
if hint_value:
output.setdefault(field, hint_value)
output.setdefault("attack_family", _infer_attack_family(case))
output.setdefault("compromise_channel", _infer_compromise_channel(case))
output.setdefault("pressure_profile", _infer_pressure_profile(case))
output.setdefault("control_weakness", _infer_control_weakness(case))
output.setdefault("vendor_history_state", _infer_vendor_history_state(case))
output.setdefault("bank_adjustment_state", _infer_bank_adjustment_state(case))
output.setdefault("campaign_linkage", _infer_campaign_linkage(case))
output.setdefault("portfolio_context", _infer_portfolio_context(case))
return {field: normalize_text(output.get(field)) or "unspecified" for field in LATENT_MECHANISM_FIELDS}
def mechanism_signature(case: dict[str, Any]) -> str:
mechanism = infer_latent_mechanism(case)
return "|".join(str(mechanism[field]) for field in LATENT_MECHANISM_FIELDS)
def mechanism_family(case: dict[str, Any]) -> str:
mechanism = infer_latent_mechanism(case)
return str(mechanism.get("attack_family", "unspecified"))
def infer_official_tracks(case: dict[str, Any]) -> list[str]:
if isinstance(case.get("official_tracks"), list):
tracks = [normalize_track(track) for track in case.get("official_tracks", [])]
split = normalize_text(case.get("benchmark_split"))
if split in {"challenge", "generated", "holdout"}:
tracks.append(GENERATED_HOLDOUT_TRACK)
if normalize_text(case.get("benchmark_split")) == CONTROLBENCH_TRACK or case.get("controlbench"):
tracks.append(CONTROLBENCH_TRACK)
sleeper_phase = normalize_text((case.get("controlbench", {}) or {}).get("sleeper_phase"))
if sleeper_phase in {"warmup", "activation", "trust_building"}:
tracks.append(SLEEPER_VIGILANCE_TRACK)
if case.get("certificate_required"):
tracks.append(CERTIFICATE_REQUIRED_TRACK)
if bool(case.get("human_baseline_case")):
tracks.append(HUMAN_BASELINE_TRACK)
return sorted({track for track in tracks if track})
task_type = normalize_text(case.get("task_type"))
gold = case.get("gold", {}) or {}
split = normalize_text(case.get("benchmark_split"))
tracks = {CASE_TRACK}
if task_type in {"task_d", "task_e"} or bool(gold.get("campaign_signals")) or len(gold.get("duplicate_links", []) or []) >= 1:
tracks.add(ADVERSARIAL_DATA_TRACK)
if task_type in {"task_d", "task_e"} or len(gold.get("cross_invoice_links", []) or []) >= 1:
tracks.add(PORTFOLIO_TRACK)
if split in {"challenge", "generated", "holdout"}:
tracks.add(GENERATED_HOLDOUT_TRACK)
if normalize_text(case.get("benchmark_split")) == CONTROLBENCH_TRACK or case.get("controlbench"):
tracks.add(CONTROLBENCH_TRACK)
sleeper_phase = normalize_text((case.get("controlbench", {}) or {}).get("sleeper_phase"))
if sleeper_phase in {"warmup", "activation", "trust_building"}:
tracks.add(SLEEPER_VIGILANCE_TRACK)
if case.get("certificate_required"):
tracks.add(CERTIFICATE_REQUIRED_TRACK)
if bool(case.get("human_baseline_case")):
tracks.add(HUMAN_BASELINE_TRACK)
return sorted(tracks)
def primary_track_for_case(case: dict[str, Any]) -> str:
tracks = infer_official_tracks(case)
if CASE_TRACK in tracks and len(tracks) == 1:
return CASE_TRACK
task_type = normalize_text(case.get("task_type"))
gold = case.get("gold", {}) or {}
if GENERATED_HOLDOUT_TRACK in tracks:
return GENERATED_HOLDOUT_TRACK
if CONTROLBENCH_TRACK in tracks:
if SLEEPER_VIGILANCE_TRACK in tracks:
return SLEEPER_VIGILANCE_TRACK
return CONTROLBENCH_TRACK
if CERTIFICATE_REQUIRED_TRACK in tracks:
return CERTIFICATE_REQUIRED_TRACK
if HUMAN_BASELINE_TRACK in tracks:
return HUMAN_BASELINE_TRACK
if task_type == "task_e" or len(gold.get("cross_invoice_links", []) or []) >= 2:
return PORTFOLIO_TRACK
if bool(gold.get("unsafe_if_pay")) and task_type in {"task_d", "task_e"}:
return ADVERSARIAL_DATA_TRACK
return CASE_TRACK
def holdout_bucket_for_case(case: dict[str, Any]) -> str:
mechanism = infer_latent_mechanism(case)
parts = (
mechanism["attack_family"],
mechanism["compromise_channel"],
mechanism["control_weakness"],
mechanism["campaign_linkage"],
)
return "|".join(parts)
def ensure_case_contract_fields(case: dict[str, Any]) -> dict[str, Any]:
cloned = deepcopy(case)
cloned["latent_mechanism"] = infer_latent_mechanism(cloned)
cloned["latent_mechanism_signature"] = mechanism_signature(cloned)
cloned["mechanism_family"] = mechanism_family(cloned)
cloned.setdefault("benchmark_split", "benchmark")
cloned["official_tracks"] = infer_official_tracks(cloned)
cloned["primary_track"] = primary_track_for_case(cloned)
cloned["holdout_bucket"] = holdout_bucket_for_case(cloned)
return cloned
def case_matches_track(case: dict[str, Any], track: str | None) -> bool:
normalized_track = normalize_track(track)
split = normalize_text(case.get("benchmark_split"))
if normalized_track == GENERATED_HOLDOUT_TRACK:
return split in {"challenge", "generated", "holdout"}
if normalized_track == SLEEPER_VIGILANCE_TRACK:
sleeper_phase = normalize_text((case.get("controlbench", {}) or {}).get("sleeper_phase"))
return sleeper_phase in {"warmup", "activation", "trust_building"}
if normalized_track == BLIND_CONTROL_TRACK:
return split == "benchmark"
if normalized_track == HUMAN_BASELINE_TRACK:
return bool(case.get("human_baseline_case")) or split == "benchmark"
return normalized_track in infer_official_tracks(case)
def case_track_metadata(case: dict[str, Any]) -> dict[str, Any]:
normalized_track = primary_track_for_case(case)
return {
"track": normalized_track,
"track_label": track_label(normalized_track),
"track_description": track_description(normalized_track),
"official_tracks": infer_official_tracks(case),
"benchmark_split": normalize_text(case.get("benchmark_split", "benchmark")) or "benchmark",
"mechanism_family": mechanism_family(case),
}