//! `skilltest-core` — the library that powers the `skilltest` CLI and, through
//! it, the language SDKs and test-framework packages.
//!
//! The flow is: load a [`Config`] and one or more [`TestCase`]s, build a
//! [`Provider`] (the boundary to `oneharness` / a model), and hand both to a
//! [`Runner`], which drives each case into a conversation, scores the transcript
//! with natural-language [`Eval`]s, and returns a [`Report`]. The report's JSON
//! form is the stable contract the language SDKs consume.
//!
//! Everything that crosses a trust boundary — config files, test-case YAML,
//! skill frontmatter, and every provider response — is parsed into a typed model
//! before use.

#![forbid(unsafe_code)]

pub mod config;
pub mod conversation;
pub mod error;
pub mod eval;
pub mod exit;
pub mod mock;
pub mod provider;
pub mod report;
pub mod runner;
pub mod skill;
pub mod testcase;

pub use config::{
    ApiJudgeConfig, ApiVendor, CommandConfig, Config, JudgeConfig, OneharnessConfig, Overrides,
    ProviderConfig,
};
pub use conversation::{Message, Role, ToolEvent, Transcript};
pub use error::{Error, ProviderErrorKind, Result};
pub use eval::{
    BooleanEval, CalledEval, Comparator, Eval, EvalDetail, EvalOutcome, JudgeValue, NotCalledEval,
    NumericEval,
};
pub use exit::ExitCode;
pub use mock::{
    DenyMessage, DenySpec, FieldPredicate, FieldPredicateSpec, MockCall, MockDecl, MockMatch,
    MockPlan, MockSet, StubOutput, StubSpec,
};
pub use provider::{
    supports_resume, ApiJudgeProvider, AssistantTurn, CommandProvider, JudgeKind, JudgeQuery,
    JudgeVerdict, OneharnessProvider, Provider, SkillRef, SplitProvider, Usage, UserTurn,
};
pub use report::{
    CaseRun, ErrorCode, Report, ReportError, Summary, ValidationFinding, ValidationReport,
};
pub use runner::{Runner, StreamEvent};
pub use skill::{load_skill, validate_path, validate_skill, Finding, SkillDefinition};
pub use testcase::{discover_cases, SimulatedUser, TestCase};
