pub const SPAN_SESSION: &str = "machi.session";
pub const SPAN_TURN: &str = "machi.turn";
pub const SPAN_SAMPLE: &str = "machi.sample";
pub const SPAN_TOOL: &str = "machi.tool";
pub const SPAN_TOOL_BATCH: &str = "machi.tool.batch";
pub const SPAN_SPAWN: &str = "machi.spawn";
pub const SPAN_WORKFLOW: &str = "machi.workflow";
pub const SPAN_WORKFLOW_HOST: &str = "machi.workflow.host";
pub const SPAN_COMPACT: &str = "machi.compact";
pub mod field {
pub const SESSION_ID: &str = "machi.session_id";
pub const AGENT_ID: &str = "machi.agent_id";
pub const AGENT_NAME: &str = "machi.agent_name";
pub const RUN_ID: &str = "machi.run_id";
pub const STEP: &str = "machi.step";
pub const TOOL_NAME: &str = "machi.tool_name";
pub const MODEL: &str = "machi.model";
pub const USAGE_INPUT: &str = "machi.usage.input_tokens";
pub const USAGE_OUTPUT: &str = "machi.usage.output_tokens";
pub const WORKFLOW_RUN_ID: &str = "machi.workflow.run_id";
pub const WORKFLOW_SEQ: &str = "machi.workflow.seq";
}
#[must_use]
pub fn required_span_names() -> &'static [&'static str] {
&[
SPAN_SESSION,
SPAN_TURN,
SPAN_SAMPLE,
SPAN_TOOL,
SPAN_TOOL_BATCH,
SPAN_SPAWN,
SPAN_WORKFLOW,
SPAN_WORKFLOW_HOST,
SPAN_COMPACT,
]
}
#[must_use]
pub fn span_catalogue_snapshot() -> String {
required_span_names().join("\n")
}
#[cfg(test)]
mod tests {
use super::*;
const SPAN_CATALOGUE_GOLDEN: &str = "\
machi.session
machi.turn
machi.sample
machi.tool
machi.tool.batch
machi.spawn
machi.workflow
machi.workflow.host
machi.compact";
#[test]
fn span_names_are_machi_prefixed_and_unique() {
let names = required_span_names();
assert_eq!(names.len(), 9, "expected nine spans");
let mut seen = std::collections::BTreeSet::new();
for name in names {
assert!(
name.starts_with("machi."),
"span {name} must start with machi."
);
assert!(seen.insert(*name), "duplicate span {name}");
}
}
#[test]
fn span_catalogue_snapshot_matches_golden() {
assert_eq!(
span_catalogue_snapshot(),
SPAN_CATALOGUE_GOLDEN,
"span catalogue changed — update golden only with deliberate contract change"
);
}
#[test]
fn field_keys_are_stable() {
assert_eq!(field::SESSION_ID, "machi.session_id");
assert_eq!(field::TOOL_NAME, "machi.tool_name");
assert_eq!(field::WORKFLOW_SEQ, "machi.workflow.seq");
}
}