sim-lib-agent 0.1.3

Agent runtime surfaces for SIM.
Documentation
use super::self_hosting::{
    cassette_content_hash, self_hosting_scenarios, validate_self_hosting_scenarios,
};

#[test]
fn self_hosting_scenarios_are_offline_and_hash_checked() {
    let scenarios = self_hosting_scenarios();
    assert_eq!(scenarios.len(), 5);
    assert!(validate_self_hosting_scenarios(&scenarios).is_empty());
    assert!(scenarios.iter().all(|scenario| !scenario.live_model));
    assert!(scenarios.iter().all(|scenario| !scenario.network));
}

#[test]
fn self_hosting_scenarios_cover_atelier_surfaces() {
    let scenarios = self_hosting_scenarios();
    let evidence = scenarios
        .iter()
        .flat_map(|scenario| scenario.evidence.iter().copied())
        .collect::<Vec<_>>();
    for required in [
        "radar",
        "codec-prism",
        "guideline-firewall",
        "validation",
        "docs",
        "pin-plan",
        "human-gate",
        "replay-hash",
    ] {
        assert!(evidence.contains(&required), "missing {required}");
    }
}

#[test]
fn change_capsule_scenario_lists_every_review_role() {
    let scenarios = self_hosting_scenarios();
    let capsule = scenarios
        .iter()
        .find(|scenario| scenario.id == "atelier-change-capsule")
        .expect("change capsule scenario");
    for role in [
        "cartographer",
        "editor",
        "guard",
        "validator",
        "docs-agent",
        "pin-agent",
        "reviewer",
        "human-gate",
    ] {
        assert!(capsule.roles.contains(&role), "missing {role}");
    }
    assert_eq!(
        cassette_content_hash(capsule.cassette_events),
        capsule.cassette_hash
    );
}