Files
clawmates/crates/cm-topology/src/lib.rs
T
Omar SobhandClaude Opus 5 d94487d3ba refactor(topology): make the 12-kinds-to-5-patterns collapse explicit
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]>
2026-07-30 10:54:43 -07:00

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),
}