Example: ITS Risk Monitoring

Isolated person with thought bubble showing converging risk factors

This example uses Joiner's Interpersonal Theory of Suicide (ITS) to compute risk factors from state. The system tracks three dimensions: Thwarted Belongingness (TB), Perceived Burdensomeness (PB), and Acquired Capability (AC). Convergence across all three signals a high-risk pattern.

The Scenario

We model a character whose social world deteriorates over time. They experience social isolation, shaming, and exposure to pain. We then query their state and compute risk convergence.

Step 1: Create the Entity

use behaviorsim_rs::entity::EntityBuilder;
use behaviorsim_rs::enums::{EventType, Species};
use behaviorsim_rs::event::EventBuilder;
use behaviorsim_rs::simulation::Simulation;
use behaviorsim_rs::types::{Duration, EntityId, Timestamp};

let person = EntityBuilder::new()
    .id("casey")
    .species(Species::Human)
    .age(Duration::years(34))
    .build()?;

let anchor = Timestamp::from_ymd_hms(2024, 1, 1, 0, 0, 0);
let mut sim = Simulation::new(anchor);
sim.add_entity(person, anchor);

let casey_id = EntityId::new("casey").unwrap();

Step 2: Apply ITS-Relevant Events

use behaviorsim_rs::enums::{EventPayload, EventType, TraumaType};
use behaviorsim_rs::event::EventBuilder;
use behaviorsim_rs::types::Timestamp;

// Thwarted Belongingness (TB)
let isolation = EventBuilder::new(EventType::ExperienceIsolationChronic)
    .target(casey_id.clone())
    .severity(0.7)
    .payload(EventPayload::SocialExclusion {
        group_id: None,
        explicit: false,
    })
    .build()?;

// Perceived Burdensomeness (PB)
let shaming = EventBuilder::new(EventType::ExperienceShamingPublic)
    .target(casey_id.clone())
    .severity(0.6)
    .payload(EventPayload::Humiliation {
        public: true,
        perpetrator: None,
    })
    .build()?;

// Acquired Capability (AC)
let exposure = EventBuilder::new(EventType::ExperienceCombatMilitary)
    .target(casey_id.clone())
    .severity(0.5)
    .payload(EventPayload::TraumaticExposure {
        trauma_type: TraumaType::Witnessing,
        proximity: 0.8,
    })
    .build()?;

let t1 = Timestamp::from_ymd_hms(2024, 2, 10, 0, 0, 0);
let t2 = Timestamp::from_ymd_hms(2024, 3, 5, 0, 0, 0);
let t3 = Timestamp::from_ymd_hms(2024, 3, 20, 0, 0, 0);

sim.add_event(isolation, t1);
sim.add_event(shaming, t2);
sim.add_event(exposure, t3);

Step 3: Compute Risk Convergence

use behaviorsim_rs::enums::ItsAlert;
use behaviorsim_rs::processor::compute_its_factors;

let handle = sim.entity(&casey_id).unwrap();
let state = handle.state_at(Timestamp::from_ymd_hms(2024, 4, 1, 0, 0, 0));
let factors = compute_its_factors(state.individual_state());

if let Some(alert) = ItsAlert::from_convergence(&factors.convergence_status) {
    println!("Risk: {}", alert.risk_level());
    println!("Focus: {}", alert.intervention_focus());
}

Interpretation

  • TB models disconnection and social isolation.
  • PB models perceived burden and shame.
  • AC models habituation to pain/fear.

When all three dimensions converge, the system emits the highest risk alert. You can then map that to in-game behaviors, narrative interventions, or content flags.