ainl-contracts 0.1.4

Shared policy contracts for repo intelligence, context freshness, and impact-first tooling (no OpenFang deps)
Documentation
//! Mission progress events for SSE / audit streams.

use serde::{Deserialize, Serialize};

use crate::assertion::AssertionState;
use crate::feature::FeatureId;
use crate::handoff::Handoff;
use crate::mission::{MissionId, MissionState};

/// Progress and lifecycle events emitted during mission execution.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "event", rename_all = "snake_case")]
pub enum MissionEvent {
    MissionAccepted {
        mission_id: MissionId,
    },
    MissionPaused {
        mission_id: MissionId,
    },
    MissionResumed {
        mission_id: MissionId,
    },
    MissionRunStarted {
        mission_id: MissionId,
    },
    WorkerSelectedFeature {
        mission_id: MissionId,
        feature_id: FeatureId,
        agent_id: String,
    },
    WorkerCompleted {
        mission_id: MissionId,
        feature_id: FeatureId,
        success_state: String,
        #[serde(default, skip_serializing_if = "Option::is_none")]
        commit_or_snapshot: Option<String>,
        #[serde(default, skip_serializing_if = "Option::is_none")]
        handoff: Option<Box<Handoff>>,
    },
    WorkerFailed {
        mission_id: MissionId,
        feature_id: FeatureId,
        reason: String,
    },
    MilestoneValidationTriggered {
        mission_id: MissionId,
        milestone: String,
    },
    OrchestratorOverride {
        mission_id: MissionId,
        reason: String,
    },
    MissionStateChanged {
        mission_id: MissionId,
        from: MissionState,
        to: MissionState,
    },
    AssertionUpdated {
        mission_id: MissionId,
        assertion_id: String,
        old_state: AssertionState,
        new_state: AssertionState,
    },
    MissionResumeRequired {
        mission_id: MissionId,
        objective_preview: String,
        last_state: MissionState,
    },
}