TopologyKind describes twelve distinct intents, but the orchestrator implements five planners and mapped the kinds onto them inside plan_steps. So Market never auctions, StarMoe never routes to experts, Ring never cycles and Holacratic never self-organizes -- each silently runs as whichever pattern it collapses to, while kind::description() and the UI catalog kept promising the distinct behaviour. Rather than delete variants that appear in persisted rows, the collapse is now named: ExecutionPattern + TopologyKind::execution_pattern() in cm-topology, with plan_steps dispatching on the pattern instead of re-listing the mapping. One source of truth, and the two cannot drift. GET /api/topologies now reports `executes_as` and `distinct_at_execution` so a UI can stop offering aliases as if they behaved differently. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
47 lines
1.7 KiB
Rust
47 lines
1.7 KiB
Rust
//! Organizational topologies for agentic systems — pure, offline modeling.
|
|
//!
|
|
//! A [`TopologyGraph`] describes *who talks to whom and who decides* in a
|
|
//! system of agents (claws). It is a description only: execution semantics
|
|
//! (and the §15 safety gates) live in the orchestrator, never here.
|
|
//!
|
|
//! This crate is dependency-light (serde + thiserror) and has no I/O, so it
|
|
//! doubles as a reusable library for benchmarking/topology research.
|
|
//!
|
|
//! Modules:
|
|
//! - [`kind`] — the curated [`TopologyKind`] taxonomy.
|
|
//! - [`graph`] — the [`TopologyGraph`] data model + validation.
|
|
//! - [`adapter`] — normalize a loose JSON/YAML spec into a graph.
|
|
//! - [`classifier`]— infer a topology kind from a graph's structure.
|
|
//! - [`heuristics`]— per-kind role distributions / optimization weights.
|
|
|
|
mod adapter;
|
|
mod builders;
|
|
mod classifier;
|
|
mod graph;
|
|
mod heuristics;
|
|
mod kind;
|
|
|
|
pub use adapter::{from_json, to_json};
|
|
pub use builders::build;
|
|
pub use classifier::{classify, Classification, GraphMetrics};
|
|
pub use graph::{Edge, EdgeKind, Node, TopologyGraph};
|
|
pub use heuristics::{heuristics, Heuristics};
|
|
pub use kind::{ExecutionPattern, TopologyKind};
|
|
|
|
/// Errors produced while building or validating a topology.
|
|
#[derive(Debug, thiserror::Error, PartialEq, Eq)]
|
|
pub enum TopologyError {
|
|
/// The graph has no nodes.
|
|
#[error("topology has no nodes")]
|
|
Empty,
|
|
/// An edge references a node id that does not exist.
|
|
#[error("edge references unknown node: {0}")]
|
|
UnknownNode(String),
|
|
/// Two nodes share an id.
|
|
#[error("duplicate node id: {0}")]
|
|
DuplicateNode(String),
|
|
/// The input spec could not be parsed.
|
|
#[error("invalid spec: {0}")]
|
|
Spec(String),
|
|
}
|