eidos-kernel 0.1.0

Eidos kernel — the pure-logic brain engine (schema, retrieval, ranking, eval). No IO.
Documentation
use std::collections::BTreeMap;

use serde::{Deserialize, Serialize};

/// The kind of work a task node represents.
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TaskOperator {
    ReadContext,
    Decompose,
    Edit,
    Check,
    Review,
    ProposeDoc,
    HumanApproval,
}

/// Runtime state vocabulary for future executors. The planner emits `Pending` only.
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TaskState {
    #[default]
    Pending,
    Ready,
    Running,
    Blocked,
    Passed,
    Failed,
    Skipped,
}

/// Coarse execution risk, used by future schedulers to gate writes/tests differently from reads.
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TaskRisk {
    Low,
    #[default]
    Medium,
    High,
}

/// Deterministic retry policy metadata. This is descriptive in v0.1; no executor consumes it yet.
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RetryPolicy {
    pub max_attempts: u8,
    pub backoff_ms: u64,
}

impl Default for RetryPolicy {
    fn default() -> Self {
        Self {
            max_attempts: 1,
            backoff_ms: 0,
        }
    }
}

/// A receipt-backed context item that can seed a grounded task brief.
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TaskContextItem {
    pub id: String,
    pub title: String,
    pub kind: String,
    pub source: String,
}

/// One node in a task DAG.
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TaskNode {
    pub id: String,
    pub title: String,
    pub operator: TaskOperator,
    #[serde(default)]
    pub state: TaskState,
    #[serde(default)]
    pub depends_on: Vec<String>,
    #[serde(default)]
    pub inputs: Vec<String>,
    #[serde(default)]
    pub outputs: Vec<String>,
    #[serde(default)]
    pub required_checks: Vec<String>,
    #[serde(default)]
    pub tools: Vec<String>,
    #[serde(default)]
    pub retry: RetryPolicy,
    #[serde(default)]
    pub risk: TaskRisk,
    #[serde(default)]
    pub receipts: Vec<String>,
}

/// An internal acyclic decomposition for an agent task brief.
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TaskDag {
    pub id: String,
    pub title: String,
    pub nodes: Vec<TaskNode>,
}

/// A single state transition, with optional evidence attached by a future executor/reviewer.
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TaskEvent {
    pub task_id: String,
    pub to: TaskState,
    #[serde(default)]
    pub evidence: Vec<String>,
    #[serde(default)]
    pub note: Option<String>,
}

/// A deterministic readiness projection for an internal decomposition.
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TaskRun {
    pub dag_id: String,
    pub states: BTreeMap<String, TaskState>,
    #[serde(default)]
    pub events: Vec<TaskEvent>,
}