ainl-contracts 0.1.4

Shared policy contracts for repo intelligence, context freshness, and impact-first tooling (no OpenFang deps)
Documentation
//! Structured worker handoff contract.

use serde::{Deserialize, Serialize};

use crate::feature::FeatureId;

/// Command run during verification with observed outcome.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct VerificationCommand {
    pub command: String,
    pub exit_code: i32,
    #[serde(default)]
    pub observation: String,
}

/// Interactive/manual check performed by the worker.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct InteractiveCheck {
    pub action: String,
    #[serde(default)]
    pub observed: String,
}

/// One test case added by the worker.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TestCase {
    pub name: String,
    #[serde(default)]
    pub verifies: String,
}

/// Test file added during feature work.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TestAdded {
    pub file: String,
    #[serde(default)]
    pub cases: Vec<TestCase>,
}

/// Aggregated test changes from a handoff.
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct HandoffTests {
    #[serde(default)]
    pub added: Vec<TestAdded>,
    #[serde(default)]
    pub updated: Vec<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub coverage: Option<String>,
}

/// Severity for discovered issues.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum IssueSeverity {
    Blocking,
    NonBlocking,
    Suggestion,
}

/// Issue discovered during feature implementation.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct DiscoveredIssue {
    pub severity: IssueSeverity,
    pub description: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub suggested_fix: Option<String>,
}

/// Deviation from expected procedure.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Deviation {
    pub step: String,
    pub reason: String,
}

/// Feedback on skill/procedure quality from the worker.
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct SkillFeedback {
    #[serde(default)]
    pub followed_procedure: bool,
    #[serde(default)]
    pub deviations: Vec<Deviation>,
    #[serde(default)]
    pub suggested_changes: Vec<String>,
}

/// Verification evidence bundled in a handoff.
#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
pub struct HandoffVerification {
    #[serde(default)]
    pub commands: Vec<VerificationCommand>,
    #[serde(default)]
    pub interactive: Vec<InteractiveCheck>,
}

/// Structured completion record from a feature worker.
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Handoff {
    pub feature_id: FeatureId,
    pub agent_id: String,
    #[serde(default)]
    pub salient_summary: String,
    #[serde(default)]
    pub what_was_implemented_md: String,
    #[serde(default)]
    pub what_was_left_undone_md: String,
    #[serde(default)]
    pub verification: HandoffVerification,
    #[serde(default)]
    pub tests: HandoffTests,
    #[serde(default)]
    pub discovered_issues: Vec<DiscoveredIssue>,
    #[serde(default)]
    pub skill_feedback: SkillFeedback,
}