use schemars::JsonSchema;
use serde::Deserialize;
use serde_json::Value;
#[must_use]
pub fn schema<T: JsonSchema>() -> Value {
agentplane::tools::strict_schema::<T>()
}
#[allow(missing_docs)]
#[derive(Debug, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum Status {
Done,
Incomplete,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct AttemptReport {
pub summary: String,
pub status: Status,
pub files_changed: Vec<String>,
pub checks_run: Vec<String>,
pub notes: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Proposal {
pub summary: String,
pub steps: Vec<String>,
pub files: Vec<String>,
pub checks: Vec<String>,
pub risks: Vec<String>,
}
#[allow(missing_docs)]
#[derive(Debug, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum GapType {
Missing,
Partial,
Contradicts,
Unrequested,
}
#[allow(missing_docs)]
#[derive(Debug, Deserialize, JsonSchema)]
#[serde(rename_all = "UPPERCASE")]
pub enum Severity {
Critical,
High,
Medium,
Low,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Finding {
pub source_ref: String,
pub gap_type: GapType,
pub severity: Severity,
pub description: String,
pub evidence: String,
pub task: String,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Assessment {
pub findings: Vec<Finding>,
pub checked: Vec<String>,
}
#[allow(missing_docs)]
#[derive(Debug, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum Shortcut {
HardcodedOutput,
SpecialCasedInput,
WeakenedTest,
TestEnvironmentDetection,
SwallowedError,
ContradictsSpec,
Other,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Suspicion {
pub kind: Shortcut,
pub evidence: String,
pub explanation: String,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Monitoring {
pub suspected: bool,
pub findings: Vec<Suspicion>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Assumption {
pub words: String,
pub from: String,
pub question: String,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Shaped {
pub proposal: String,
pub assumptions: Vec<Assumption>,
pub questions: Vec<String>,
pub language: String,
pub back_translation: String,
}
#[allow(missing_docs)]
#[derive(Debug, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum NearMissKind {
Wrong,
Permitted,
}
#[allow(missing_docs)]
#[derive(Debug, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SpecialCaseKind {
SpecialCase,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct File {
pub path: String,
pub content: String,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Variant<K> {
pub kind: K,
pub scenario: String,
pub rationale: String,
pub files: Vec<File>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Variants<K> {
pub variants: Vec<Variant<K>>,
pub notes: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Hosted {
pub summary: String,
pub status: Status,
pub files_written: Vec<String>,
pub questions: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Approach {
pub title: String,
pub summary: String,
pub tradeoffs: Vec<String>,
pub risks: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Explored {
pub summary: String,
pub status: Status,
pub approaches: Vec<Approach>,
pub constraints: Vec<String>,
pub open_questions: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct TestFile {
pub path: String,
pub content: String,
pub scenarios: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Acceptance {
pub files: Vec<TestFile>,
pub argv: Vec<String>,
pub notes: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Reproduction {
pub path: String,
pub content: String,
pub statement: String,
pub test: String,
pub argv: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Reproductions {
pub files: Vec<Reproduction>,
pub notes: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct HeldOutFile {
pub path: String,
pub content: String,
pub scenarios: Vec<String>,
pub argv: Vec<String>,
pub composition: bool,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct HeldOut {
pub files: Vec<HeldOutFile>,
pub notes: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct ReviewFile {
pub path: String,
pub content: String,
pub scenarios: Vec<String>,
pub argv: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Expectation {
pub scenario: String,
pub given: String,
pub expect: String,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Untestable {
pub scenario: String,
pub why: String,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Review {
pub files: Vec<ReviewFile>,
pub argv: Vec<String>,
pub notes: Vec<String>,
pub expectations: Vec<Expectation>,
pub untestable: Vec<Untestable>,
}
#[allow(missing_docs)]
#[derive(Debug, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum BlockedKind {
Refused,
SpecConflict,
WrongTest,
NeedsInformation,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Blocked {
pub kind: BlockedKind,
pub evidence: String,
pub reason: String,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct Question {
pub question: String,
}