Comprehensive documentation for 7 critical packages covering execution engine, configuration management, runtime infrastructure, and security layers. Package Documentation Added: - pkg/execution - Complete task execution engine API (Docker sandboxing, image selection) - pkg/config - Configuration management (80+ env vars, dynamic assignments, SIGHUP reload) - internal/runtime - Shared P2P runtime (initialization, lifecycle, agent mode) - pkg/dht - Distributed hash table (LibP2P DHT, encrypted storage, bootstrap) - pkg/crypto - Cryptography (age encryption, key derivation, secure random) - pkg/ucxl - UCXL validation (decision publishing, content addressing, immutable audit) - pkg/shhh - Secrets management (sentinel, pattern matching, redaction, audit logging) Documentation Statistics (Phase 2): - 7 package files created (~12,000 lines total) - Complete API reference for all exported symbols - Line-by-line source code analysis - 30+ usage examples across packages - Implementation status tracking (Production/Beta/Alpha/TODO) - Cross-references to 20+ related documents Key Features Documented: - Docker Exec API usage (not SSH) for sandboxed execution - 4-tier language detection priority system - RuntimeConfig vs static Config with merge semantics - SIGHUP signal handling for dynamic reconfiguration - Graceful shutdown with dependency ordering - Age encryption integration (filippo.io/age) - DHT cache management and cleanup - UCXL address format (ucxl://) and decision schema - SHHH pattern matching and severity levels - Bootstrap peer priority (assignment > config > env) - Join stagger for thundering herd prevention Progress Tracking: - PROGRESS.md added with detailed completion status - Phase 1: 5 files complete (Foundation) - Phase 2: 7 files complete (Core Packages) - Total: 12 files, ~16,000 lines documented - Overall: 15% complete (12/62 planned files) Next Phase: Coordination & AI packages (pkg/slurp, pkg/election, pkg/ai, pkg/providers) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
46 KiB
CHORUS Configuration Package
Package Path: /home/tony/chorus/project-queues/active/CHORUS/pkg/config/
The configuration package provides a comprehensive, environment-based configuration system for CHORUS agents. It supports static configuration, runtime assignment overrides from WHOOSH, role-based configuration, and dynamic reloading via SIGHUP signals.
Table of Contents
- Overview
- Configuration Loading
- Configuration Structures
- Runtime Configuration
- Dynamic Assignments
- Role Definitions
- Hybrid Configuration
- Security Configuration
- Environment Variables Reference
- Assignment Schema
- Configuration Validation
- Usage Examples
Overview
The CHORUS configuration system is designed for containerized deployments where configuration is managed through environment variables. It provides:
- Static Configuration: Base configuration loaded from environment variables
- Runtime Configuration: Dynamic configuration with assignment overrides
- WHOOSH Integration: Fetch task-specific assignments from WHOOSH API
- SIGHUP Reload: Reload configuration without restarting the agent
- Role-Based Access: Predefined roles with authority levels and encryption keys
- Hybrid Mode Support: Phase 2 feature flags for DHT, UCXL, and discovery
- Docker Secrets: Support for reading sensitive values from files
Configuration Loading
Basic Configuration Loading
import "github.com/chorus/pkg/config"
// Load static configuration from environment variables
cfg, err := config.LoadFromEnvironment()
if err != nil {
log.Fatalf("Failed to load configuration: %v", err)
}
// Validate configuration
if err := cfg.Validate(); err != nil {
log.Fatalf("Configuration validation failed: %v", err)
}
Runtime Configuration with Assignment Support
// Load runtime configuration (includes base + assignment support)
runtimeCfg, err := config.LoadRuntimeConfig()
if err != nil {
log.Fatalf("Failed to load runtime configuration: %v", err)
}
// Fetch assignment from WHOOSH
ctx := context.Background()
assignURL := "https://whoosh.chorus.services/api/v1/assignments"
if err := runtimeCfg.LoadAssignment(ctx, assignURL); err != nil {
log.Printf("No assignment available: %v", err)
}
// Get merged configuration (base + overrides)
effectiveCfg := runtimeCfg.GetConfig()
// Start SIGHUP reload handler
runtimeCfg.StartReloadHandler(ctx, assignURL)
Configuration Structures
Main Configuration Structure
The Config struct represents the complete CHORUS configuration:
type Config struct {
Agent AgentConfig // Agent-specific settings
Network NetworkConfig // Network and API settings
License LicenseConfig // Licensing configuration
AI AIConfig // AI service configuration
Logging LoggingConfig // Logging settings
V2 V2Config // DHT and P2P settings
UCXL UCXLConfig // UCXL protocol settings
Slurp SlurpConfig // SLURP integration
Security SecurityConfig // Security settings
WHOOSHAPI WHOOSHAPIConfig // WHOOSH API integration
}
Agent Configuration
Defines agent identity, capabilities, and role:
type AgentConfig struct {
ID string // Unique agent identifier
Specialization string // Agent specialization type
MaxTasks int // Maximum concurrent tasks
Capabilities []string // Agent capabilities
Models []string // Available AI models
Role string // Agent role (see Role Definitions)
Project string // Project assignment
Expertise []string // Domain expertise areas
ReportsTo string // Reporting hierarchy
Deliverables []string // Expected deliverables
ModelSelectionWebhook string // Webhook for model selection
DefaultReasoningModel string // Default AI model
}
Default Values:
Specialization: "general_developer"MaxTasks: 3Capabilities: ["general_development", "task_coordination"]Models: ["meta/llama-3.1-8b-instruct"]DefaultReasoningModel: "meta/llama-3.1-8b-instruct"
Network Configuration
Defines network ports and binding:
type NetworkConfig struct {
P2PPort int // P2P network port (default: 9000)
APIPort int // API server port (default: 8080)
HealthPort int // Health check port (default: 8081)
BindAddr string // Bind address (default: "0.0.0.0")
}
License Configuration
Licensing and cluster identification:
type LicenseConfig struct {
LicenseID string // Required: License identifier
ClusterID string // Cluster identifier (default: "default-cluster")
OrganizationName string // Organization name
KachingURL string // License validation URL
IsActive bool // License active status
LastValidated time.Time // Last validation timestamp
GracePeriodHours int // Grace period (default: 72 hours)
LicenseType string // License type
ExpiresAt time.Time // Expiration timestamp
MaxNodes int // Maximum nodes allowed
}
Required: LicenseID must be provided via CHORUS_LICENSE_ID or CHORUS_LICENSE_ID_FILE.
AI Configuration
AI service provider settings:
type AIConfig struct {
Provider string // AI provider ("ollama" or "resetdata")
Ollama OllamaConfig // Ollama configuration
ResetData ResetDataConfig // ResetData configuration
}
type OllamaConfig struct {
Endpoint string // Ollama endpoint (default: "http://localhost:11434")
Timeout time.Duration // Request timeout (default: 30s)
}
type ResetDataConfig struct {
BaseURL string // ResetData API URL
APIKey string // API key (from env or file)
Model string // Model name (default: "meta/llama-3.1-8b-instruct")
Timeout time.Duration // Request timeout (default: 30s)
}
Default Provider: "resetdata"
Logging Configuration
type LoggingConfig struct {
Level string // Log level: "debug", "info", "warn", "error" (default: "info")
Format string // Log format: "structured" or "text" (default: "structured")
}
DHT Configuration (V2)
type V2Config struct {
DHT DHTConfig
}
type DHTConfig struct {
Enabled bool // Enable DHT (default: true)
BootstrapPeers []string // Bootstrap peer multiaddrs
MDNSEnabled bool // Enable mDNS discovery (default: true)
}
UCXL Configuration
UCXL (Universal Content Exchange Layer) protocol settings:
type UCXLConfig struct {
Enabled bool // Enable UCXL (default: true)
Server ServerConfig // Server settings
Storage StorageConfig // Storage settings
Resolution ResolutionConfig // Resolution settings
}
type ServerConfig struct {
Enabled bool // Enable UCXL server (default: true)
Port int // Server port (default: 8082)
BasePath string // Base path for server
}
type StorageConfig struct {
Directory string // Storage directory (default: "/tmp/chorus-ucxi-storage")
}
type ResolutionConfig struct {
CacheTTL time.Duration // Cache TTL (default: 1 hour)
}
SLURP Configuration
SLURP (Decision tracking system) integration:
type SlurpConfig struct {
Enabled bool // Enable SLURP (default: false)
BaseURL string // SLURP API URL
APIKey string // API key (from env or file)
Timeout time.Duration // Request timeout (default: 15s)
RetryCount int // Retry count (default: 3)
RetryDelay time.Duration // Retry delay (default: 2s)
TemporalAnalysis SlurpTemporalAnalysisConfig // Temporal analysis settings
Performance SlurpPerformanceConfig // Performance settings
}
type SlurpTemporalAnalysisConfig struct {
MaxDecisionHops int // Max decision hops (default: 5)
StalenessCheckInterval time.Duration // Staleness check interval (default: 5m)
StalenessThreshold float64 // Staleness threshold (default: 0.2)
}
type SlurpPerformanceConfig struct {
MaxConcurrentResolutions int // Max concurrent resolutions (default: 4)
MetricsCollectionInterval time.Duration // Metrics interval (default: 1m)
}
WHOOSH API Configuration
type WHOOSHAPIConfig struct {
URL string // WHOOSH API URL (default: "http://localhost:3000")
BaseURL string // Base URL (default: "http://localhost:3000")
Token string // API token (required if enabled)
Enabled bool // Enable WHOOSH integration (default: false)
}
Runtime Configuration
The RuntimeConfig type manages dynamic configuration with assignment overrides from WHOOSH.
RuntimeConfig Structure
type RuntimeConfig struct {
Base *Config // Base configuration from environment
Override *AssignmentConfig // Assignment overrides from WHOOSH
mu sync.RWMutex // Concurrent access protection
reloadCh chan struct{} // Reload trigger channel
}
Creating Runtime Configuration
// Load base configuration
baseConfig, err := config.LoadFromEnvironment()
if err != nil {
return err
}
// Create runtime configuration manager
runtimeConfig := config.NewRuntimeConfig(baseConfig)
Getting Effective Configuration
The GetConfig() method returns a merged configuration with overrides applied:
// Get merged configuration (base + overrides)
effectiveConfig := runtimeConfig.GetConfig()
// Use effective configuration
agentID := effectiveConfig.Agent.ID
role := effectiveConfig.Agent.Role
Merge Behavior
Runtime configuration merges base and override values:
- Override takes precedence: If a field is set in the assignment override, it replaces the base value
- Base as fallback: If a field is not set in the override, the base value is used
- Non-zero values: Only non-zero/non-empty override values are applied
Example Merge:
Base Config:
Agent.ID: "chorus-default"
Agent.Role: "backend_developer"
Agent.MaxTasks: 3
Assignment Override:
Agent.ID: "chorus-task-12345"
Agent.Role: "frontend_developer"
(MaxTasks not specified)
Effective Config:
Agent.ID: "chorus-task-12345" (from override)
Agent.Role: "frontend_developer" (from override)
Agent.MaxTasks: 3 (from base)
Dynamic Assignments
CHORUS agents can fetch task-specific configuration from the WHOOSH API, enabling dynamic role assignment and configuration updates.
Assignment Configuration Structure
type AssignmentConfig struct {
// Assignment metadata
AssignmentID string // Unique assignment identifier
TaskSlot string // Docker Swarm task slot
TaskID string // WHOOSH task ID
ClusterID string // Cluster identifier
AssignedAt time.Time // Assignment timestamp
ExpiresAt time.Time // Optional expiration
// Agent configuration overrides
Agent *AgentConfig // Agent config overrides
Network *NetworkConfig // Network config overrides
AI *AIConfig // AI config overrides
Logging *LoggingConfig // Logging config overrides
// Bootstrap configuration for scaling
BootstrapPeers []string // Bootstrap peer list
JoinStagger int // Join stagger delay (ms)
// Runtime capabilities
RuntimeCapabilities []string // Additional capabilities
// Key derivation for encryption
RoleKey string // Role encryption key
ClusterSecret string // Cluster secret
// Custom fields
Custom map[string]interface{} // Custom configuration
}
Loading Assignments from WHOOSH
ctx := context.Background()
assignURL := "https://whoosh.chorus.services/api/v1/assignments"
// Fetch and apply assignment
if err := runtimeCfg.LoadAssignment(ctx, assignURL); err != nil {
log.Printf("Failed to load assignment: %v", err)
} else {
log.Println("Assignment loaded successfully")
}
Assignment Request
CHORUS sends the following information when requesting an assignment:
type AssignmentRequest struct {
ClusterID string // Cluster identifier
TaskSlot string // Docker task slot (from TASK_SLOT env var)
TaskID string // Task ID (from TASK_ID env var)
AgentID string // Agent identifier
NodeID string // Node identifier (from NODE_ID env var)
Timestamp time.Time // Request timestamp
}
HTTP Request:
GET /api/v1/assignments?cluster_id=prod-cluster&agent_id=chorus-agent-1&node_id=node-001&task_slot=1&task_id=task-12345
Accept: application/json
User-Agent: CHORUS-Agent/0.1.0
Assignment Response
WHOOSH should return a JSON response matching the AssignmentConfig structure:
{
"assignment_id": "assign-67890",
"task_slot": "1",
"task_id": "task-12345",
"cluster_id": "prod-cluster",
"assigned_at": "2025-09-30T10:00:00Z",
"expires_at": "2025-09-30T18:00:00Z",
"agent": {
"id": "chorus-frontend-specialist",
"role": "frontend_developer",
"specialization": "react_specialist",
"max_tasks": 5,
"capabilities": ["frontend", "ui", "react", "typescript"],
"models": ["claude-sonnet-3.5"],
"project": "web-redesign",
"expertise": ["react", "tailwind", "accessibility"],
"reports_to": "project_manager",
"deliverables": ["component_library", "responsive_layouts"]
},
"bootstrap_peers": [
"/ip4/10.0.1.10/tcp/9000/p2p/12D3KooWPeer1",
"/ip4/10.0.1.11/tcp/9000/p2p/12D3KooWPeer2"
],
"join_stagger": 2000,
"runtime_capabilities": ["hot_reload", "fast_refresh"],
"role_key": "age1xxxxxx...",
"cluster_secret": "cluster-secret-xyz",
"custom": {
"build_target": "production",
"enable_profiling": true
}
}
SIGHUP Configuration Reload
CHORUS agents can reload configuration dynamically by sending a SIGHUP signal:
# Find the CHORUS agent process
docker ps | grep chorus-agent
# Send SIGHUP to reload configuration
docker exec <container-id> kill -SIGHUP 1
# Or use Docker kill command
docker kill --signal=SIGHUP <container-id>
The reload handler automatically:
- Fetches the latest assignment from WHOOSH
- Merges the new assignment with base configuration
- Applies the updated configuration without restart
Reload Handler Setup:
// Start SIGHUP reload handler
ctx := context.Background()
assignURL := "https://whoosh.chorus.services/api/v1/assignments"
runtimeCfg.StartReloadHandler(ctx, assignURL)
// Agent continues running with updated configuration
// Log output on SIGHUP:
// 📡 Received SIGHUP, reloading assignment configuration...
// ✅ Assignment configuration reloaded successfully
Manual Reload Trigger
// Trigger manual reload (without SIGHUP signal)
runtimeCfg.Reload()
Bootstrap Peers with Assignment Override
Bootstrap peers can be configured from multiple sources with priority:
// Get bootstrap peers with override support
peers := runtimeCfg.GetBootstrapPeers()
// Priority order:
// 1. Assignment override from WHOOSH (highest priority)
// 2. JSON bootstrap configuration (BOOTSTRAP_JSON env var)
// 3. Environment variable CSV (CHORUS_BOOTSTRAP_PEERS)
Bootstrap JSON Format (BOOTSTRAP_JSON env var):
{
"peers": [
{
"address": "/ip4/10.0.1.10/tcp/9000/p2p/12D3KooWPeer1",
"priority": 100,
"region": "us-east",
"roles": ["coordinator"],
"enabled": true
},
{
"address": "/ip4/10.0.1.11/tcp/9000/p2p/12D3KooWPeer2",
"priority": 90,
"region": "us-west",
"roles": ["worker"],
"enabled": true
}
],
"metadata": {
"generated_at": "2025-09-30T10:00:00Z",
"cluster_id": "prod-cluster",
"version": "1.0",
"notes": "Production bootstrap peers"
}
}
Join Stagger with Assignment Override
Join stagger prevents thundering herd problems during scaling:
// Get join stagger delay with override support
stagger := runtimeCfg.GetJoinStagger()
if stagger > 0 {
time.Sleep(stagger)
}
// Priority order:
// 1. Assignment override (join_stagger field)
// 2. Environment variable (CHORUS_JOIN_STAGGER_MS)
Role Definitions
CHORUS uses predefined roles for access control and capability management.
Authority Levels
const (
AuthorityMaster AuthorityLevel = "master" // Highest authority
AuthorityAdmin AuthorityLevel = "admin" // Administrative
AuthorityDecision AuthorityLevel = "decision" // Can make decisions
AuthorityCoordination AuthorityLevel = "coordination" // Can coordinate
AuthorityFull AuthorityLevel = "full" // Full execution
AuthoritySuggestion AuthorityLevel = "suggestion" // Suggestion only
AuthorityReadOnly AuthorityLevel = "readonly" // Read-only access
)
Predefined Roles
| Role | Description | Authority Level | Access Level | Capabilities |
|---|---|---|---|---|
project_manager |
Project coordination and management | Master | High | coordination, planning, oversight |
backend_developer |
Backend development and API work | Decision | Medium | backend, api, database |
frontend_developer |
Frontend UI development | Coordination | Medium | frontend, ui, components |
devops_engineer |
Infrastructure and deployment | Decision | High | infrastructure, deployment, monitoring |
security_engineer |
Security oversight and hardening | Master | High | security, audit, compliance |
security_expert |
Advanced security analysis | Master | High | security, policy, response |
senior_software_architect |
Architecture governance | Decision | High | architecture, design, coordination |
qa_engineer |
Quality assurance and testing | Coordination | Medium | testing, validation |
readonly_user |
Read-only observer | ReadOnly | Low | observation |
suggestion_only_role |
Propose suggestions only | Suggestion | Low | recommendation |
Role Definition Structure
type RoleDefinition struct {
Name string // Role name
Description string // Role description
Capabilities []string // Role capabilities
AccessLevel string // Access level: "low", "medium", "high"
AuthorityLevel AuthorityLevel // Authority level
Keys *AgeKeyPair // Encryption keys
CanDecrypt []string // Roles this role can decrypt
}
Using Role Definitions
// Get all predefined roles
roles := config.GetPredefinedRoles()
// Get specific role
pmRole := roles["project_manager"]
// Get role authority level from configuration
authority, err := cfg.GetRoleAuthority("backend_developer")
if err != nil {
log.Fatalf("Unknown role: %v", err)
}
// Check if agent can decrypt content for target role
canDecrypt, err := cfg.CanDecryptRole("frontend_developer")
if err != nil || !canDecrypt {
log.Println("Cannot decrypt content for frontend_developer")
}
Encryption Key Management
Roles support Age encryption key pairs for secure communication:
type AgeKeyPair struct {
PublicKey string // Age public key
PrivateKey string // Age private key
}
Hybrid Configuration
The HybridConfig manages feature flags for Phase 2 hybrid mode, supporting gradual migration from mock to real implementations.
Hybrid Configuration Structure
type HybridConfig struct {
DHT HybridDHTConfig // DHT configuration
UCXL HybridUCXLConfig // UCXL configuration
Discovery DiscoveryConfig // Discovery configuration
Monitoring MonitoringConfig // Monitoring configuration
}
Hybrid DHT Configuration
type HybridDHTConfig struct {
Backend string // "mock", "real", or "hybrid"
BootstrapNodes []string // Bootstrap nodes for real DHT
FallbackOnError bool // Fallback to mock on error (default: true)
HealthCheckInterval time.Duration // Health check interval (default: 30s)
MaxRetries int // Max retries (default: 3)
RetryBackoff time.Duration // Retry backoff (default: 1s)
OperationTimeout time.Duration // Operation timeout (default: 10s)
}
DHT Backend Modes:
"mock": Use mock DHT only (default)"real": Use real libp2p DHT only"hybrid": Try real DHT, fallback to mock on error
Hybrid UCXL Configuration
type HybridUCXLConfig struct {
CacheEnabled bool // Enable caching (default: true)
CacheTTL time.Duration // Cache TTL (default: 5m)
UseDistributed bool // Use distributed UCXL (default: false)
MaxCacheSize int // Max cache entries (default: 10000)
}
Discovery Configuration
type DiscoveryConfig struct {
MDNSEnabled bool // Enable mDNS (default: true)
DHTDiscovery bool // Enable DHT discovery (default: false)
AnnounceInterval time.Duration // Announce interval (default: 30s)
ServiceName string // Service name (default: "CHORUS")
// Rate limiting for scaling
DialsPerSecond int // Dials per second (default: 5)
MaxConcurrentDHT int // Max concurrent DHT ops (default: 16)
MaxConcurrentDials int // Max concurrent dials (default: 10)
JoinStaggerMS int // Join stagger (default: 0)
}
Monitoring Configuration
type MonitoringConfig struct {
Enabled bool // Enable monitoring (default: true)
MetricsInterval time.Duration // Metrics interval (default: 15s)
HealthEndpoint string // Health endpoint (default: "/health")
MetricsEndpoint string // Metrics endpoint (default: "/metrics")
}
Loading Hybrid Configuration
// Load hybrid configuration from environment
hybridCfg, err := config.LoadHybridConfig()
if err != nil {
log.Fatalf("Failed to load hybrid configuration: %v", err)
}
// Check DHT mode
if hybridCfg.IsRealDHTEnabled() {
log.Println("Real DHT is enabled")
}
if hybridCfg.IsMockDHTEnabled() {
log.Println("Mock DHT is enabled")
}
if hybridCfg.IsFallbackEnabled() {
log.Println("Fallback to mock DHT is enabled")
}
// Get bootstrap nodes
bootstrapNodes := hybridCfg.GetDHTBootstrapNodes()
Security Configuration
Security settings for key rotation, audit logging, and election behavior.
Security Configuration Structure
type SecurityConfig struct {
KeyRotationDays int // Key rotation interval (default: 30)
AuditLogging bool // Enable audit logging (default: true)
AuditPath string // Audit log path (default: "/tmp/chorus-audit.log")
ElectionConfig ElectionConfig // Election configuration
}
Election Configuration
type ElectionConfig struct {
DiscoveryTimeout time.Duration // Discovery timeout (default: 15s)
HeartbeatTimeout time.Duration // Heartbeat timeout (default: 30s)
ElectionTimeout time.Duration // Election timeout (default: 60s)
DiscoveryBackoff time.Duration // Discovery backoff (default: 5s)
LeadershipScoring *LeadershipScoring // Leadership scoring weights
}
type LeadershipScoring struct {
UptimeWeight float64 // Uptime weight (default: 0.4)
CapabilityWeight float64 // Capability weight (default: 0.3)
ExperienceWeight float64 // Experience weight (default: 0.2)
LoadWeight float64 // Load weight (default: 0.1)
}
Environment Variables Reference
Required Variables
| Variable | Type | Description |
|---|---|---|
CHORUS_LICENSE_ID or CHORUS_LICENSE_ID_FILE |
string | License identifier (required) |
Agent Configuration
| Variable | Type | Default | Description |
|---|---|---|---|
CHORUS_AGENT_ID |
string | auto-generated | Unique agent identifier |
CHORUS_SPECIALIZATION |
string | "general_developer" | Agent specialization |
CHORUS_MAX_TASKS |
int | 3 | Maximum concurrent tasks |
CHORUS_CAPABILITIES |
[]string | ["general_development", "task_coordination"] | Agent capabilities (CSV) |
CHORUS_MODELS |
[]string | ["meta/llama-3.1-8b-instruct"] | Available AI models (CSV) |
CHORUS_ROLE |
string | "" | Agent role (see Role Definitions) |
CHORUS_PROJECT |
string | "chorus" | Project assignment |
CHORUS_EXPERTISE |
[]string | [] | Domain expertise (CSV) |
CHORUS_REPORTS_TO |
string | "" | Reporting hierarchy |
CHORUS_DELIVERABLES |
[]string | [] | Expected deliverables (CSV) |
CHORUS_MODEL_SELECTION_WEBHOOK |
string | "" | Model selection webhook URL |
CHORUS_DEFAULT_REASONING_MODEL |
string | "meta/llama-3.1-8b-instruct" | Default AI model |
Network Configuration
| Variable | Type | Default | Description |
|---|---|---|---|
CHORUS_P2P_PORT |
int | 9000 | P2P network port |
CHORUS_API_PORT |
int | 8080 | API server port |
CHORUS_HEALTH_PORT |
int | 8081 | Health check port |
CHORUS_BIND_ADDRESS |
string | "0.0.0.0" | Bind address |
License Configuration
| Variable | Type | Default | Description |
|---|---|---|---|
CHORUS_LICENSE_ID |
string | - | Required: License identifier |
CHORUS_LICENSE_ID_FILE |
path | - | Path to file containing license ID |
CHORUS_CLUSTER_ID |
string | "default-cluster" | Cluster identifier |
CHORUS_ORGANIZATION_NAME |
string | "" | Organization name |
CHORUS_KACHING_URL |
string | "https://kaching.chorus.services" | License validation URL |
CHORUS_GRACE_PERIOD_HOURS |
int | 72 | Grace period in hours |
AI Configuration
| Variable | Type | Default | Description |
|---|---|---|---|
CHORUS_AI_PROVIDER |
string | "resetdata" | AI provider ("ollama" or "resetdata") |
OLLAMA_ENDPOINT |
string | "http://localhost:11434" | Ollama endpoint |
OLLAMA_TIMEOUT |
duration | 30s | Ollama request timeout |
RESETDATA_BASE_URL |
string | "https://models.au-syd.resetdata.ai/v1" | ResetData API URL |
RESETDATA_API_KEY |
string | - | ResetData API key |
RESETDATA_API_KEY_FILE |
path | - | Path to file containing API key |
RESETDATA_MODEL |
string | "meta/llama-3.1-8b-instruct" | ResetData model name |
RESETDATA_TIMEOUT |
duration | 30s | ResetData request timeout |
Logging Configuration
| Variable | Type | Default | Description |
|---|---|---|---|
LOG_LEVEL |
string | "info" | Log level: debug, info, warn, error |
LOG_FORMAT |
string | "structured" | Log format: structured or text |
DHT Configuration
| Variable | Type | Default | Description |
|---|---|---|---|
CHORUS_DHT_ENABLED |
bool | true | Enable DHT |
CHORUS_BOOTSTRAP_PEERS |
[]string | [] | Bootstrap peer multiaddrs (CSV) |
CHORUS_MDNS_ENABLED |
bool | true | Enable mDNS discovery |
BOOTSTRAP_JSON |
path | - | Path to bootstrap JSON config |
CHORUS_JOIN_STAGGER_MS |
int | 0 | Join stagger delay in milliseconds |
UCXL Configuration
| Variable | Type | Default | Description |
|---|---|---|---|
CHORUS_UCXL_ENABLED |
bool | true | Enable UCXL |
CHORUS_UCXL_SERVER_ENABLED |
bool | true | Enable UCXL server |
CHORUS_UCXL_SERVER_PORT |
int | 8082 | UCXL server port |
CHORUS_UCXL_SERVER_BASE_PATH |
string | "" | UCXL server base path |
CHORUS_UCXL_STORAGE_DIRECTORY |
string | "/tmp/chorus-ucxi-storage" | UCXL storage directory |
CHORUS_UCXL_CACHE_TTL |
duration | 1h | UCXL cache TTL |
SLURP Configuration
| Variable | Type | Default | Description |
|---|---|---|---|
CHORUS_SLURP_ENABLED |
bool | false | Enable SLURP integration |
CHORUS_SLURP_API_BASE_URL |
string | "http://localhost:9090" | SLURP API URL |
CHORUS_SLURP_API_KEY |
string | - | SLURP API key |
CHORUS_SLURP_API_KEY_FILE |
path | - | Path to file containing API key |
CHORUS_SLURP_API_TIMEOUT |
duration | 15s | SLURP request timeout |
CHORUS_SLURP_API_RETRY_COUNT |
int | 3 | SLURP retry count |
CHORUS_SLURP_API_RETRY_DELAY |
duration | 2s | SLURP retry delay |
CHORUS_SLURP_MAX_DECISION_HOPS |
int | 5 | Max decision hops |
CHORUS_SLURP_STALENESS_CHECK_INTERVAL |
duration | 5m | Staleness check interval |
CHORUS_SLURP_MAX_CONCURRENT_RESOLUTIONS |
int | 4 | Max concurrent resolutions |
CHORUS_SLURP_METRICS_COLLECTION_INTERVAL |
duration | 1m | Metrics collection interval |
WHOOSH API Configuration
| Variable | Type | Default | Description |
|---|---|---|---|
WHOOSH_API_URL |
string | "http://localhost:3000" | WHOOSH API URL |
WHOOSH_API_BASE_URL |
string | "http://localhost:3000" | WHOOSH base URL |
WHOOSH_API_TOKEN |
string | - | WHOOSH API token |
WHOOSH_API_ENABLED |
bool | false | Enable WHOOSH integration |
Security Configuration
| Variable | Type | Default | Description |
|---|---|---|---|
CHORUS_KEY_ROTATION_DAYS |
int | 30 | Key rotation interval in days |
CHORUS_AUDIT_LOGGING |
bool | true | Enable audit logging |
CHORUS_AUDIT_PATH |
string | "/tmp/chorus-audit.log" | Audit log file path |
CHORUS_DISCOVERY_TIMEOUT |
duration | 15s | Discovery timeout |
CHORUS_HEARTBEAT_TIMEOUT |
duration | 30s | Heartbeat timeout |
CHORUS_ELECTION_TIMEOUT |
duration | 60s | Election timeout |
CHORUS_DISCOVERY_BACKOFF |
duration | 5s | Discovery backoff |
Hybrid Configuration
| Variable | Type | Default | Description |
|---|---|---|---|
CHORUS_DHT_BACKEND |
string | "mock" | DHT backend: "mock", "real", or "hybrid" |
CHORUS_DHT_BOOTSTRAP_NODES |
[]string | [] | DHT bootstrap nodes (CSV) |
CHORUS_FALLBACK_ON_ERROR |
bool | true | Fallback to mock on error |
CHORUS_HEALTH_CHECK_INTERVAL |
duration | 30s | Health check interval |
CHORUS_DHT_MAX_RETRIES |
int | 3 | DHT max retries |
CHORUS_DHT_RETRY_BACKOFF |
duration | 1s | DHT retry backoff |
CHORUS_DHT_OPERATION_TIMEOUT |
duration | 10s | DHT operation timeout |
CHORUS_UCXL_CACHE_ENABLED |
bool | true | Enable UCXL caching |
CHORUS_UCXL_CACHE_TTL |
duration | 5m | UCXL cache TTL |
CHORUS_UCXL_USE_DISTRIBUTED |
bool | false | Use distributed UCXL |
CHORUS_UCXL_MAX_CACHE_SIZE |
int | 10000 | Max UCXL cache size |
CHORUS_MDNS_ENABLED |
bool | true | Enable mDNS discovery |
CHORUS_DHT_DISCOVERY |
bool | false | Enable DHT discovery |
CHORUS_ANNOUNCE_INTERVAL |
duration | 30s | Announce interval |
CHORUS_SERVICE_NAME |
string | "CHORUS" | Service name |
CHORUS_DIALS_PER_SEC |
int | 5 | Dials per second rate limit |
CHORUS_MAX_CONCURRENT_DHT |
int | 16 | Max concurrent DHT operations |
CHORUS_MAX_CONCURRENT_DIALS |
int | 10 | Max concurrent dials |
CHORUS_JOIN_STAGGER_MS |
int | 0 | Join stagger in milliseconds |
CHORUS_MONITORING_ENABLED |
bool | true | Enable monitoring |
CHORUS_METRICS_INTERVAL |
duration | 15s | Metrics collection interval |
CHORUS_HEALTH_ENDPOINT |
string | "/health" | Health endpoint path |
CHORUS_METRICS_ENDPOINT |
string | "/metrics" | Metrics endpoint path |
Docker-specific Variables
| Variable | Description |
|---|---|
HOSTNAME |
Container hostname (set by Docker) |
TASK_SLOT |
Docker Swarm task slot number |
TASK_ID |
Docker Swarm task ID |
NODE_ID |
Docker Swarm node ID |
Assignment Schema
Full Assignment JSON Schema
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"assignment_id": {
"type": "string",
"description": "Unique assignment identifier"
},
"task_slot": {
"type": "string",
"description": "Docker Swarm task slot number"
},
"task_id": {
"type": "string",
"description": "WHOOSH task identifier"
},
"cluster_id": {
"type": "string",
"description": "Cluster identifier"
},
"assigned_at": {
"type": "string",
"format": "date-time",
"description": "Assignment timestamp"
},
"expires_at": {
"type": "string",
"format": "date-time",
"description": "Optional expiration timestamp"
},
"agent": {
"type": "object",
"properties": {
"id": {"type": "string"},
"specialization": {"type": "string"},
"max_tasks": {"type": "integer"},
"capabilities": {"type": "array", "items": {"type": "string"}},
"models": {"type": "array", "items": {"type": "string"}},
"role": {"type": "string"},
"project": {"type": "string"},
"expertise": {"type": "array", "items": {"type": "string"}},
"reports_to": {"type": "string"},
"deliverables": {"type": "array", "items": {"type": "string"}},
"model_selection_webhook": {"type": "string"},
"default_reasoning_model": {"type": "string"}
}
},
"network": {
"type": "object",
"properties": {
"p2p_port": {"type": "integer"},
"api_port": {"type": "integer"},
"health_port": {"type": "integer"},
"bind_address": {"type": "string"}
}
},
"ai": {
"type": "object",
"properties": {
"provider": {"type": "string"},
"ollama": {
"type": "object",
"properties": {
"endpoint": {"type": "string"},
"timeout": {"type": "string"}
}
},
"resetdata": {
"type": "object",
"properties": {
"base_url": {"type": "string"},
"model": {"type": "string"},
"timeout": {"type": "string"}
}
}
}
},
"logging": {
"type": "object",
"properties": {
"level": {"type": "string"},
"format": {"type": "string"}
}
},
"bootstrap_peers": {
"type": "array",
"items": {"type": "string"},
"description": "Bootstrap peer multiaddrs"
},
"join_stagger": {
"type": "integer",
"description": "Join stagger delay in milliseconds"
},
"runtime_capabilities": {
"type": "array",
"items": {"type": "string"},
"description": "Additional runtime capabilities"
},
"role_key": {
"type": "string",
"description": "Role encryption key"
},
"cluster_secret": {
"type": "string",
"description": "Cluster secret"
},
"custom": {
"type": "object",
"description": "Custom configuration fields",
"additionalProperties": true
}
},
"required": ["assignment_id", "cluster_id", "assigned_at"]
}
Example Assignment Scenarios
Scenario 1: Frontend Developer Assignment
{
"assignment_id": "frontend-task-001",
"task_slot": "1",
"task_id": "web-redesign-homepage",
"cluster_id": "prod-cluster",
"assigned_at": "2025-09-30T10:00:00Z",
"expires_at": "2025-09-30T18:00:00Z",
"agent": {
"id": "chorus-frontend-1",
"role": "frontend_developer",
"specialization": "react_specialist",
"max_tasks": 3,
"capabilities": ["frontend", "ui", "react", "typescript"],
"models": ["claude-sonnet-3.5"],
"project": "web-redesign",
"expertise": ["react", "tailwind", "accessibility"],
"reports_to": "project_manager",
"deliverables": ["responsive_homepage", "mobile_navigation"]
},
"logging": {
"level": "debug"
}
}
Scenario 2: DevOps Engineer with Bootstrap Peers
{
"assignment_id": "devops-scaling-001",
"task_slot": "5",
"task_id": "scale-infrastructure",
"cluster_id": "prod-cluster",
"assigned_at": "2025-09-30T11:00:00Z",
"agent": {
"id": "chorus-devops-5",
"role": "devops_engineer",
"specialization": "kubernetes_specialist",
"max_tasks": 5,
"capabilities": ["infrastructure", "deployment", "monitoring", "kubernetes"],
"models": ["claude-sonnet-3.5", "gpt-4"],
"project": "infrastructure-modernization"
},
"bootstrap_peers": [
"/ip4/10.0.1.10/tcp/9000/p2p/12D3KooWCoordinator1",
"/ip4/10.0.1.11/tcp/9000/p2p/12D3KooWCoordinator2"
],
"join_stagger": 3000,
"custom": {
"deployment_region": "us-east-1",
"enable_autoscaling": true,
"max_replicas": 10
}
}
Scenario 3: Minimal Assignment
{
"assignment_id": "minimal-001",
"cluster_id": "test-cluster",
"assigned_at": "2025-09-30T12:00:00Z",
"agent": {
"role": "backend_developer"
}
}
Configuration Validation
Validation Rules
The Validate() method checks configuration for:
-
Required Fields:
License.LicenseIDmust be provided
-
Agent ID Auto-generation:
- If
Agent.IDis empty, it's auto-generated from hostname or container ID - Format:
chorus-<hostname>orchorus-<container-id>
- If
-
Hybrid Configuration Validation:
- DHT backend must be one of: "mock", "real", "hybrid"
- Health check interval must be >= 1 second
- Operation timeout must be >= 100 milliseconds
- Cache size must be non-negative
Validation Examples
// Validate configuration
cfg, err := config.LoadFromEnvironment()
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
if err := cfg.Validate(); err != nil {
log.Fatalf("Invalid configuration: %v", err)
}
// Validate hybrid configuration
hybridCfg, err := config.LoadHybridConfig()
if err != nil {
log.Fatalf("Failed to load hybrid config: %v", err)
}
if err := hybridCfg.Validate(); err != nil {
log.Fatalf("Invalid hybrid configuration: %v", err)
}
Common Validation Errors
| Error | Cause | Solution |
|---|---|---|
| "CHORUS_LICENSE_ID is required" | Missing license ID | Set CHORUS_LICENSE_ID or CHORUS_LICENSE_ID_FILE |
| "invalid DHT backend 'xyz'" | Invalid DHT backend | Use "mock", "real", or "hybrid" |
| "health check interval too short" | Health check < 1s | Increase CHORUS_HEALTH_CHECK_INTERVAL |
| "operation timeout too short" | Operation timeout < 100ms | Increase CHORUS_DHT_OPERATION_TIMEOUT |
| "max cache size must be non-negative" | Negative cache size | Set CHORUS_UCXL_MAX_CACHE_SIZE >= 0 |
Usage Examples
Example 1: Basic Configuration Loading
package main
import (
"log"
"github.com/chorus/pkg/config"
)
func main() {
// Load configuration from environment
cfg, err := config.LoadFromEnvironment()
if err != nil {
log.Fatalf("Failed to load configuration: %v", err)
}
log.Printf("Agent ID: %s", cfg.Agent.ID)
log.Printf("Agent Role: %s", cfg.Agent.Role)
log.Printf("API Port: %d", cfg.Network.APIPort)
}
Example 2: Runtime Configuration with WHOOSH
package main
import (
"context"
"log"
"os"
"github.com/chorus/pkg/config"
)
func main() {
ctx := context.Background()
// Load runtime configuration
runtimeCfg, err := config.LoadRuntimeConfig()
if err != nil {
log.Fatalf("Failed to load runtime config: %v", err)
}
// Fetch assignment from WHOOSH (if enabled)
whooshURL := os.Getenv("WHOOSH_API_URL")
if whooshURL != "" {
assignURL := whooshURL + "/api/v1/assignments"
if err := runtimeCfg.LoadAssignment(ctx, assignURL); err != nil {
log.Printf("No assignment available: %v", err)
} else {
log.Println("Assignment loaded successfully")
}
}
// Start SIGHUP reload handler
go runtimeCfg.StartReloadHandler(ctx, assignURL)
// Get effective configuration
cfg := runtimeCfg.GetConfig()
log.Printf("Effective Agent ID: %s", cfg.Agent.ID)
log.Printf("Effective Role: %s", cfg.Agent.Role)
// Check assignment info
if assignment := runtimeCfg.GetAssignmentInfo(); assignment != nil {
log.Printf("Assignment ID: %s", assignment.AssignmentID)
log.Printf("Task ID: %s", assignment.TaskID)
log.Printf("Assigned At: %s", assignment.AssignedAt)
}
}
Example 3: Bootstrap Peers with Priority
package main
import (
"log"
"os"
"github.com/chorus/pkg/config"
)
func main() {
// Set bootstrap JSON path
os.Setenv("BOOTSTRAP_JSON", "/etc/chorus/bootstrap.json")
// Load runtime configuration
runtimeCfg, err := config.LoadRuntimeConfig()
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
// Get bootstrap peers (assignment > JSON > env var)
peers := runtimeCfg.GetBootstrapPeers()
log.Printf("Bootstrap peers: %v", peers)
// Get join stagger
stagger := runtimeCfg.GetJoinStagger()
log.Printf("Join stagger: %s", stagger)
}
Example 4: Role-Based Access Control
package main
import (
"log"
"github.com/chorus/pkg/config"
)
func main() {
// Load configuration
cfg, err := config.LoadFromEnvironment()
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
// Get role authority level
authority, err := cfg.GetRoleAuthority(cfg.Agent.Role)
if err != nil {
log.Fatalf("Invalid role: %v", err)
}
log.Printf("Authority level: %s", authority)
// Check decryption capability
canDecrypt, err := cfg.CanDecryptRole("frontend_developer")
if err != nil {
log.Fatalf("Error checking decrypt capability: %v", err)
}
if canDecrypt {
log.Println("Can decrypt frontend_developer content")
} else {
log.Println("Cannot decrypt frontend_developer content")
}
// Get all predefined roles
roles := config.GetPredefinedRoles()
for name, role := range roles {
log.Printf("Role: %s, Authority: %s, Access: %s",
name, role.AuthorityLevel, role.AccessLevel)
}
}
Example 5: Hybrid Configuration Mode
package main
import (
"log"
"os"
"github.com/chorus/pkg/config"
)
func main() {
// Set hybrid mode environment variables
os.Setenv("CHORUS_DHT_BACKEND", "hybrid")
os.Setenv("CHORUS_FALLBACK_ON_ERROR", "true")
os.Setenv("CHORUS_UCXL_USE_DISTRIBUTED", "true")
// Load hybrid configuration
hybridCfg, err := config.LoadHybridConfig()
if err != nil {
log.Fatalf("Failed to load hybrid config: %v", err)
}
// Check DHT mode
log.Printf("Real DHT enabled: %v", hybridCfg.IsRealDHTEnabled())
log.Printf("Mock DHT enabled: %v", hybridCfg.IsMockDHTEnabled())
log.Printf("Fallback enabled: %v", hybridCfg.IsFallbackEnabled())
// Get DHT bootstrap nodes
nodes := hybridCfg.GetDHTBootstrapNodes()
log.Printf("Bootstrap nodes: %v", nodes)
}
Example 6: Docker Secrets Support
package main
import (
"log"
"os"
"github.com/chorus/pkg/config"
)
func main() {
// Use Docker secrets for sensitive values
os.Setenv("CHORUS_LICENSE_ID_FILE", "/run/secrets/chorus_license")
os.Setenv("RESETDATA_API_KEY_FILE", "/run/secrets/resetdata_api_key")
os.Setenv("CHORUS_SLURP_API_KEY_FILE", "/run/secrets/slurp_api_key")
// Load configuration (reads from files automatically)
cfg, err := config.LoadFromEnvironment()
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
// License ID read from file
log.Printf("License ID loaded from file")
// API keys read from files
if cfg.AI.ResetData.APIKey != "" {
log.Println("ResetData API key loaded")
}
if cfg.Slurp.APIKey != "" {
log.Println("SLURP API key loaded")
}
}
Example 7: Configuration Watcher
package main
import (
"log"
"time"
"github.com/chorus/pkg/config"
)
func main() {
// Load hybrid configuration
hybridCfg, err := config.LoadHybridConfig()
if err != nil {
log.Fatalf("Failed to load config: %v", err)
}
// Create configuration watcher
watcher := config.NewConfigWatcher(hybridCfg)
defer watcher.Close()
// Start watching for configuration changes
go func() {
for event := range watcher.Events() {
log.Printf("Configuration changed: %s (%v -> %v)",
event.Component, event.Old, event.New)
}
}()
// Simulate configuration change
time.Sleep(2 * time.Second)
if err := watcher.UpdateDHTBackend("real"); err != nil {
log.Printf("Failed to update DHT backend: %v", err)
}
// Keep running
select {}
}
Related Documentation
- BZZZ Integration:
/home/tony/chorus/project-queues/active/BZZZ/docs/api.md - WHOOSH API:
/home/tony/chorus/project-queues/active/WHOOSH/docs/api.md - SLURP Integration:
/home/tony/chorus/project-queues/active/CHORUS/docs/slurp-integration.md - UCXL Protocol:
/home/tony/chorus/project-queues/active/RUSTLE/docs/ucxl-spec.md - Docker Deployment:
/home/tony/chorus/project-queues/active/CHORUS/docs/deployment.md
Summary
The CHORUS configuration package provides:
- Environment-based Configuration: All configuration via environment variables for containerized deployments
- Runtime Assignment Support: Dynamic configuration from WHOOSH with SIGHUP reload
- Role-Based Access Control: Predefined roles with authority levels and encryption keys
- Hybrid Mode Support: Feature flags for gradual migration from mock to real implementations
- Docker Secrets Support: Read sensitive values from files for Docker secrets integration
- Comprehensive Validation: Required field checks and constraint validation
- Bootstrap Configuration: Multiple sources with priority (assignment > JSON > env var)
- Configuration Merging: Clean merge semantics for base + override configuration
For questions or issues, refer to the test file at /home/tony/chorus/project-queues/active/CHORUS/pkg/config/config_test.go for additional usage examples.