sim-lib-agent 0.1.12

Agent runtime surfaces for SIM.
Documentation
use sim_kernel::Symbol;

use super::{
    AgentMission, AtelierBackend, CONTRACT_NATIVE_SCHEMA, ContractNativeAtelierReport,
    deterministic_contract_native_report,
};

#[test]
fn source_radar_is_the_default_backend() {
    assert_eq!(AtelierBackend::default(), AtelierBackend::SourceRadar);
    assert_eq!(
        AtelierBackend::parse("source-radar"),
        Some(AtelierBackend::SourceRadar)
    );
    assert_eq!(
        AtelierBackend::parse("contract-native"),
        Some(AtelierBackend::ContractNative)
    );
    assert_eq!(AtelierBackend::parse("source"), None);
}

#[test]
fn deterministic_contract_native_report_caches_backend_evidence() {
    let report = deterministic_contract_native_report();
    assert_eq!(report.backend, AtelierBackend::ContractNative);
    assert_eq!(report.deck.cards, 4);
    assert_eq!(report.projection.tokens, 114);
    assert_eq!(report.grammar.dialect, "shapegrammar");
    assert!(report.grammar.strict);
    assert_eq!(report.route_attempts.len(), 2);
    assert!(report.cassette_hash.starts_with("fnv1a64:"));

    let json = report.to_json();
    assert_eq!(json["schema"], CONTRACT_NATIVE_SCHEMA);
    assert_eq!(json["backend"], "contract-native");
    assert_eq!(json["projection"]["summary_only"], 1);
    assert_eq!(json["grammar"]["target_codec"], "codec:lisp");
    assert!(
        json["diagnostics"]
            .as_array()
            .unwrap()
            .iter()
            .any(|item| item.as_str().unwrap().contains("source-free"))
    );
}

#[test]
fn contract_native_report_keeps_guard_denials() {
    let report = deterministic_contract_native_report();
    let ids = denial_ids(&report);
    assert!(ids.contains(&"meta-workspace-edit".to_owned()));
    assert!(ids.contains(&"cross-repo-write".to_owned()));
    assert!(ids.contains(&"github-outward-action".to_owned()));
    assert!(
        report
            .guard_denials
            .iter()
            .any(|denial| denial.reason.contains(".meta-workspace"))
    );
    assert!(
        report
            .guard_denials
            .iter()
            .any(|denial| denial.reason.contains("mission lease"))
    );
    assert!(
        report
            .guard_denials
            .iter()
            .any(|denial| denial.reason.contains("GitHub remote"))
    );
}

#[test]
fn guard_denials_are_source_free_mission_checks() {
    let mission = AgentMission::new(
        Symbol::qualified("agent/mission", "contract-native-test"),
        "sim-agent-net",
    );
    let denials = super::contract_native_guard_denials(&mission);
    assert_eq!(denials.len(), 3);
    assert!(denials.iter().all(|denial| !denial.action.is_empty()));
    assert!(denials.iter().all(|denial| !denial.reason.is_empty()));
}

fn denial_ids(report: &ContractNativeAtelierReport) -> Vec<String> {
    report
        .guard_denials
        .iter()
        .map(|denial| denial.id.clone())
        .collect()
}