Domain Model

This document describes all domain entities in paladin-ai-core and the Medieval Military naming convention that provides Paladin's ubiquitous language.

Medieval Military Naming Convention

Paladin applies Domain-Driven Design's ubiquitous language principle through a consistent Medieval Military theme. Use these terms in all code, documentation, and discussions:

TermDDD ConceptRust Type / Location
PaladinAggregate root — autonomous AI agentPaladin · crates/paladin-core/src/platform/container/paladin.rs
BattalionAggregate — coordinated group of PaladinsBattalion types · crates/paladin-core/src/platform/container/battalion/
FormationSequential execution patternFormationService · crates/paladin-battalion/src/formation_service.rs
PhalanxConcurrent execution patternPhalanxService · crates/paladin-battalion/src/phalanx_service.rs
CampaignGraph / DAG execution patternCampaignService · crates/paladin-battalion/src/campaign_service.rs
Chain of CommandHierarchical delegation patternChainOfCommandService · crates/paladin-battalion/src/chain_of_command_service.rs
ConclaveMixture-of-experts synthesisConclaveExecutionService · crates/paladin-battalion/src/conclave_execution_service.rs
CouncilMulti-agent discussion and consensusCouncilService · crates/paladin-battalion/src/council_service.rs
GroveSemantic routingGroveService · crates/paladin-battalion/src/grove_service.rs
ManeuverFlow DSL executionmaneuver/ · crates/paladin-battalion/src/maneuver/
CommanderStrategy auto-detect routerCommander · crates/paladin-battalion/src/commander.rs
GarrisonShort-term conversation memoryGarrison domain · crates/paladin-core/src/platform/container/garrison.rs
SanctumLong-term vector / semantic memorySanctum domain · crates/paladin-core/src/platform/container/sanctum.rs
ArsenalTool registryArsenal domain · crates/paladin-core/src/platform/container/arsenal/
ArmamentA single registered toolPart of Arsenal
CitadelState persistence and recoveryCitadel domain · crates/paladin-core/src/platform/container/citadel.rs
HeraldOutput formatting systemHerald · crates/paladin-core/src/platform/container/herald.rs
QuestA task or mission assigned to a PaladinInformal / documentation term

Node Pattern

All domain entities use the Node<T> wrapper which adds identifier, timestamps, and metadata to any data payload:

// crates/paladin-core/src/base/node.rs
pub struct Node<T> {
    pub id:         Uuid,
    pub created_at: DateTime<Utc>,
    pub updated_at: DateTime<Utc>,
    pub node:       T,         // The domain payload
}

Domain types are type aliases:

// crates/paladin-core/src/platform/container/paladin.rs
pub type Paladin = Node<PaladinData>;

Core Domain Entities

Paladin (Aggregate Root)

// PaladinData — the domain payload inside Node<PaladinData>
pub struct PaladinData {
    pub name:          String,
    pub system_prompt: String,
    pub model:         String,
    pub temperature:   f32,
    pub max_loops:     u32,
    pub stop_words:    Vec<String>,
    pub status:        PaladinStatus,
}

pub enum PaladinStatus {
    Idle,
    Running,
    Completed,
    Failed,
    Timeout,
}

pub type Paladin = Node<PaladinData>;

Invariants:

  • system_prompt must not be empty
  • temperature must be in 0.0..=2.0
  • max_loops must be >= 1

Garrison (Memory Domain)

// crates/paladin-core/src/platform/container/garrison.rs
pub struct GarrisonEntry {
    pub role:       MessageRole,   // User | Assistant | System | Tool
    pub content:    String,
    pub token_count: usize,
    pub metadata:   HashMap<String, Value>,
}

Adapters: InMemoryGarrison, SqliteGarrison (feature sqlite) — see Garrison Memory.

Arsenal (Tool Domain)

// crates/paladin-core/src/platform/container/arsenal/
pub struct ToolDefinition {
    pub name:        String,
    pub description: String,
    pub parameters:  serde_json::Value,  // JSON Schema
}

pub struct ToolCall {
    pub id:        String,
    pub tool_name: String,
    pub arguments: serde_json::Value,
}

pub struct ToolResult {
    pub tool_call_id: String,
    pub content:      String,
    pub is_error:     bool,
}

Citadel (State Persistence)

// crates/paladin-core/src/platform/container/citadel.rs
pub struct CitadelEntry {
    pub paladin_name: String,
    pub state:        PaladinState,
    pub saved_at:     DateTime<Utc>,
}

Herald (Output Formatting)

// crates/paladin-core/src/platform/container/herald.rs
pub trait Herald: Send + Sync {
    fn format(&self, result: &PaladinResult, paladin: &Paladin) -> Result<String, HeraldError>;
}

Implementations: JsonHerald, MarkdownHerald, TableHerald — see Herald Output.

Base Primitives (crates/paladin-core/src/base/)

TypePurpose
Node<T>Universal entity wrapper (id + timestamps + payload)
Collection<T>Typed collection with pagination
FieldDynamic field definition for content metadata
MessageInter-agent message passing
ActionAgent action descriptor
EventDomain event for cross-context communication

Error Types

Each domain has a dedicated error enum using thiserror:

Error typeLocation
PaladinErrorcrates/paladin-core/src/platform/container/paladin_error.rs
GarrisonErrorcrates/paladin-core/src/platform/container/garrison_error.rs
LlmErrorcrates/paladin-llm/src/error.rs
ArsenalErrorcrates/paladin-ports/src/output/arsenal_port.rs
SanctumErrorcrates/paladin-memory/src/sanctum/

See Design Patterns for the error handling convention.

Bounded Contexts

ContextCratesAggregate root
Agent executionpaladin-ai-core, paladin-ports, paladin-llmPaladin
Memorypaladin-ai-core, paladin-ports, paladin-memoryGarrison / Sanctum
Orchestrationpaladin-ai-core, paladin-ports, paladin-battalionBattalion
Tool integrationpaladin-ai-core, paladin-portsArsenal
State persistencepaladin-ai-core, paladin-portsCitadel
Content ingestionpaladin-ai-core, paladin-ports, paladin-contentContentItem
Storagepaladin-ai-core, paladin-ports, paladin-storageUser / ContentList

See Also