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>
25 KiB
internal/runtime - Shared P2P Runtime Infrastructure
Package: internal/runtime
Files: shared.go (687 lines), agent_support.go (324 lines)
Status: ✅ Production
Purpose: Shared initialization and lifecycle management for all CHORUS binaries
Overview
The internal/runtime package provides the unified initialization and lifecycle management infrastructure used by all CHORUS binaries (chorus-agent, chorus-hap). It consolidates:
- Configuration loading from environment variables
- License validation with KACHING server
- P2P networking setup (libp2p, mDNS, DHT)
- Component initialization (PubSub, Election, Coordinator, API servers)
- Health monitoring and graceful shutdown
- Dynamic reconfiguration via SIGHUP signal
Key Responsibilities
✅ Single initialization path for all binaries ✅ Consistent component lifecycle management ✅ Graceful shutdown with dependency ordering ✅ Health monitoring and readiness checks ✅ Dynamic assignment loading from WHOOSH ✅ BACKBEAT telemetry integration ✅ SHHH secrets detection setup
Package Structure
Files
| File | Lines | Purpose |
|---|---|---|
shared.go |
687 | Main initialization, SharedRuntime, component setup |
agent_support.go |
324 | Agent mode behaviors, announcements, health checks |
Build Variables
// Lines 36-42 in shared.go
var (
AppName = "CHORUS"
AppVersion = "0.1.0-dev"
AppCommitHash = "unknown"
AppBuildDate = "unknown"
)
Set by main packages:
// In cmd/agent/main.go or cmd/hap/main.go
runtime.AppVersion = version
runtime.AppCommitHash = commitHash
runtime.AppBuildDate = buildDate
Core Type: SharedRuntime
Definition
// Lines 108-133 in shared.go
type SharedRuntime struct {
Config *config.Config
RuntimeConfig *config.RuntimeConfig
Logger *SimpleLogger
Context context.Context
Cancel context.CancelFunc
Node *p2p.Node
PubSub *pubsub.PubSub
HypercoreLog *logging.HypercoreLog
MDNSDiscovery *discovery.MDNSDiscovery
BackbeatIntegration *backbeat.Integration
DHTNode *dht.LibP2PDHT
EncryptedStorage *dht.EncryptedDHTStorage
DecisionPublisher *ucxl.DecisionPublisher
ElectionManager *election.ElectionManager
TaskCoordinator *coordinator.TaskCoordinator
HTTPServer *api.HTTPServer
UCXIServer *ucxi.Server
HealthManager *health.Manager
EnhancedHealth *health.EnhancedHealthChecks
ShutdownManager *shutdown.Manager
TaskTracker *SimpleTaskTracker
Metrics *metrics.CHORUSMetrics
Shhh *shhh.Sentinel
}
Field Descriptions
| Field | Type | Purpose | Optional |
|---|---|---|---|
Config |
*config.Config |
Static configuration from env | No |
RuntimeConfig |
*config.RuntimeConfig |
Dynamic assignments | No |
Logger |
*SimpleLogger |
Basic logging interface | No |
Context |
context.Context |
Root context | No |
Cancel |
context.CancelFunc |
Cancellation function | No |
Node |
*p2p.Node |
libp2p host | No |
PubSub |
*pubsub.PubSub |
Message broadcasting | No |
HypercoreLog |
*logging.HypercoreLog |
Append-only event log | No |
MDNSDiscovery |
*discovery.MDNSDiscovery |
Local peer discovery | No |
BackbeatIntegration |
*backbeat.Integration |
P2P telemetry | Yes |
DHTNode |
*dht.LibP2PDHT |
Distributed hash table | Yes |
EncryptedStorage |
*dht.EncryptedDHTStorage |
Encrypted DHT wrapper | Yes |
DecisionPublisher |
*ucxl.DecisionPublisher |
UCXL decision recording | Yes |
ElectionManager |
*election.ElectionManager |
Leader election | No |
TaskCoordinator |
*coordinator.TaskCoordinator |
Task distribution | No |
HTTPServer |
*api.HTTPServer |
REST API | No |
UCXIServer |
*ucxi.Server |
UCXL content resolution | Yes |
HealthManager |
*health.Manager |
Health monitoring | No |
EnhancedHealth |
*health.EnhancedHealthChecks |
Advanced checks | Yes |
ShutdownManager |
*shutdown.Manager |
Graceful shutdown | No |
TaskTracker |
*SimpleTaskTracker |
Active task tracking | No |
Metrics |
*metrics.CHORUSMetrics |
Metrics collection | No |
Shhh |
*shhh.Sentinel |
Secrets detection | No |
Initialization Flow
Function: Initialize()
// Line 136 in shared.go
func Initialize(appMode string) (*SharedRuntime, error)
Parameters:
appMode: Either"agent"or"hap"to distinguish binary type
Returns:
*SharedRuntime: Fully initialized runtime with all componentserror: If any critical component fails to initialize
Initialization Phases
Phase 1: Configuration (lines 136-199)
├─→ Create SharedRuntime struct
├─→ Initialize SimpleLogger
├─→ Create root context
├─→ Load configuration from environment (LoadFromEnvironment)
├─→ Initialize RuntimeConfig for dynamic assignments
├─→ Load assignment from WHOOSH if ASSIGN_URL set
├─→ Start SIGHUP reload handler for runtime reconfiguration
└─→ CRITICAL: Validate license with KACHING (lines 182-191)
└─→ FATAL if license invalid
Phase 2: AI Provider (lines 193-198)
├─→ Configure AI provider (Ollama or ResetData)
├─→ Set model selection webhook
└─→ Initialize prompt sources
Phase 3: Security (lines 201-213)
├─→ Initialize metrics collector
├─→ Create SHHH sentinel for secrets detection
└─→ Set audit sink for redaction logging
Phase 4: BACKBEAT (lines 215-229)
├─→ Create BACKBEAT integration (optional)
├─→ Start beat synchronization if available
└─→ Warn if unavailable (non-fatal)
Phase 5: P2P Node (lines 231-252)
├─→ Create libp2p node (p2p.NewNode)
├─→ Log node ID and listening addresses
├─→ Initialize Hypercore append-only log
└─→ Set SHHH redactor on Hypercore log
Phase 6: Discovery (lines 254-259)
├─→ Create mDNS discovery service
└─→ Service name: "chorus-peer-discovery"
Phase 7: PubSub (lines 261-284)
├─→ Initialize PubSub with Hypercore logging
├─→ Set SHHH redactor on PubSub
├─→ Subscribe to default topics
└─→ Join role-based topics if role configured
Phase 8: Election System (lines 286-289)
├─→ Call initializeElectionSystem()
└─→ See Election Initialization section below
Phase 9: DHT Storage (lines 291-293)
├─→ Call initializeDHTStorage()
└─→ See DHT Initialization section below
Phase 10: Services (lines 295-297)
├─→ Call initializeServices()
└─→ See Services Initialization section below
Return: Fully initialized SharedRuntime
Election Initialization
// Lines 347-401 in shared.go
func (r *SharedRuntime) initializeElectionSystem() error
Process:
-
Create Election Manager (line 349)
electionManager := election.NewElectionManager( r.Context, r.Config, r.Node.Host(), r.PubSub, r.Node.ID().ShortString(), ) -
Set Callbacks (lines 352-392)
-
OnAdminChange: Fired when admin changes
- Logs admin transition
- Tracks with BACKBEAT if available
- If this node becomes admin:
- Enables SLURP functionality
- Applies admin role configuration
-
OnElectionComplete: Fired when election finishes
- Logs winner
- Tracks with BACKBEAT if available
-
-
Start Election Manager (lines 394-399)
if err := electionManager.Start(); err != nil { return fmt.Errorf("failed to start election manager: %v", err) } -
Store Reference (line 397)
DHT Initialization
// Lines 403-521 in shared.go
func (r *SharedRuntime) initializeDHTStorage() error
Process:
-
Check if DHT Enabled (line 409)
if r.Config.V2.DHT.Enabled { -
Create DHT Node (lines 411-417)
dhtNode, err = dht.NewLibP2PDHT(r.Context, r.Node.Host()) -
Bootstrap DHT (lines 419-435)
- Track with BACKBEAT if available
- Call
dhtNode.Bootstrap() - Handle errors gracefully
-
Connect to Bootstrap Peers (lines 437-487)
- Get bootstrap peers from RuntimeConfig (assignment overrides)
- Fall back to static config if no assignment
- Apply join stagger delay if configured (thundering herd prevention)
- For each bootstrap peer:
- Parse multiaddr
- Extract peer info
- Track with BACKBEAT if available
- Connect via
r.Node.Host().Connect()
-
Initialize Encrypted Storage (lines 489-500)
encryptedStorage = dht.NewEncryptedDHTStorage( r.Context, r.Node.Host(), dhtNode, r.Config, r.Node.ID().ShortString(), ) encryptedStorage.StartCacheCleanup(5 * time.Minute) -
Initialize Decision Publisher (lines 502-510)
decisionPublisher = ucxl.NewDecisionPublisher( r.Context, r.Config, encryptedStorage, r.Node.ID().ShortString(), r.Config.Agent.ID, ) -
Store References (lines 516-518)
Services Initialization
// Lines 523-598 in shared.go
func (r *SharedRuntime) initializeServices() error
Process:
-
Create Task Tracker (lines 524-535)
taskTracker := &SimpleTaskTracker{ maxTasks: r.Config.Agent.MaxTasks, activeTasks: make(map[string]bool), } if r.DecisionPublisher != nil { taskTracker.decisionPublisher = r.DecisionPublisher } -
Create Task Coordinator (lines 537-550)
taskCoordinator := coordinator.NewTaskCoordinator( r.Context, r.PubSub, r.HypercoreLog, r.Config, r.Node.ID().ShortString(), nil, // HMMM router placeholder taskTracker, ) taskCoordinator.Start() -
Start HTTP API Server (lines 552-560)
httpServer := api.NewHTTPServer( r.Config.Network.APIPort, r.HypercoreLog, r.PubSub, ) go func() { if err := httpServer.Start(); err != nil && err != http.ErrServerClosed { r.Logger.Error("❌ HTTP server error: %v", err) } }() -
Start UCXI Server (Optional) (lines 562-596)
- Only if UCXL enabled and server enabled in config
- Create content storage directory
- Initialize address resolver
- Create UCXI server config
- Start server in goroutine
Agent Mode
Function: StartAgentMode()
// Lines 33-84 in agent_support.go
func (r *SharedRuntime) StartAgentMode() error
Purpose: Activates autonomous agent behaviors after initialization
Process:
-
Start Background Goroutines (lines 34-37)
go r.announceAvailability() // Broadcast work capacity every 30s go r.announceCapabilitiesOnChange() // Announce capabilities once go r.announceRoleOnStartup() // Announce role if configured -
Start Status Reporter (line 40)
go r.statusReporter() // Log peer count every 60s -
Setup Health & Shutdown (lines 46-75)
- Create shutdown manager (30s graceful timeout)
- Create health manager
- Register health checks (setupHealthChecks)
- Register shutdown components (setupGracefulShutdown)
- Start health monitoring
- Start health HTTP server (port 8081)
- Start shutdown manager
-
Wait for Shutdown (line 80)
shutdownManager.Wait() // Blocks until SIGINT/SIGTERM
Availability Broadcasting
// Lines 86-116 in agent_support.go
func (r *SharedRuntime) announceAvailability()
Behavior:
- Runs every 30 seconds
- Publishes to PubSub topic:
AvailabilityBcast - Payload:
{ "node_id": "12D3Koo...", "available_for_work": true/false, "current_tasks": 2, "max_tasks": 3, "last_activity": 1727712345, "status": "ready" | "working" | "busy", "timestamp": 1727712345 }
Status Values:
"ready": 0 active tasks"working": 1+ tasks but < max"busy": At max capacity
Capabilities Broadcasting
// Lines 129-165 in agent_support.go
func (r *SharedRuntime) announceCapabilitiesOnChange()
Behavior:
- Runs once on startup
- Publishes to PubSub topic:
CapabilityBcast - Payload:
{ "agent_id": "chorus-agent-1", "node_id": "12D3Koo...", "version": "0.5.0-dev", "capabilities": ["code_execution", "git_operations"], "expertise": ["rust", "go"], "models": ["qwen2.5-coder:32b"], "specialization": "backend", "max_tasks": 3, "current_tasks": 0, "timestamp": 1727712345, "availability": "ready" }
TODO (line 164): Watch for live capability changes and re-broadcast
Role Broadcasting
// Lines 167-204 in agent_support.go
func (r *SharedRuntime) announceRoleOnStartup()
Behavior:
- Runs once on startup (only if role configured)
- Publishes to PubSub topic:
RoleAnnouncement - Uses role-based message options
- Payload:
{ "agent_id": "chorus-agent-1", "node_id": "12D3Koo...", "role": "developer", "expertise": ["rust", "go"], "capabilities": ["code_execution"], "reports_to": "admin-agent", "specialization": "backend", "timestamp": 1727712345 }
Health Checks Setup
// Lines 206-264 in agent_support.go
func (r *SharedRuntime) setupHealthChecks(healthManager *health.Manager)
Registered Checks:
-
BACKBEAT Health Check (lines 208-236)
- Name:
"backbeat" - Interval: 30 seconds
- Timeout: 10 seconds
- Critical: No
- Checks: Connection to BACKBEAT server
- Only registered if BACKBEAT integration available
- Name:
-
Enhanced Health Checks (lines 248-263)
- Requires: PubSub, ElectionManager, DHTNode
- Creates:
EnhancedHealthChecksinstance - Registers: Election, DHT, PubSub, Replication checks
- See:
pkg/healthpackage for details
Graceful Shutdown Setup
// Lines 266-323 in agent_support.go
func (r *SharedRuntime) setupGracefulShutdown(
shutdownManager *shutdown.Manager,
healthManager *health.Manager,
)
Shutdown Order (by priority, higher = later):
| Priority | Component | Timeout | Critical |
|---|---|---|---|
| 10 | HTTP API Server | Default | Yes |
| 15 | Health Manager | Default | Yes |
| 20 | UCXI Server | Default | Yes |
| 30 | PubSub | Default | Yes |
| 35 | DHT Node | Default | Yes |
| 40 | P2P Node | Default | Yes |
| 45 | Election Manager | Default | Yes |
| 50 | BACKBEAT Integration | Default | Yes |
Why This Order:
- Stop accepting new requests (HTTP)
- Stop health reporting
- Stop content resolution (UCXI)
- Stop broadcasting messages (PubSub)
- Stop DHT queries/storage
- Close P2P connections
- Stop election participation
- Disconnect BACKBEAT telemetry
Cleanup Flow
Function: Cleanup()
// Lines 302-344 in shared.go
func (r *SharedRuntime) Cleanup()
Manual Cleanup (used if StartAgentMode not called):
1. Stop BACKBEAT Integration (line 306)
2. Close mDNS Discovery (lines 310-312)
3. Close PubSub (lines 314-316)
4. Close DHT Node (lines 318-320)
5. Close P2P Node (lines 322-324)
6. Stop HTTP Server (lines 326-328)
7. Stop UCXI Server (lines 330-332)
8. Stop Election Manager (lines 334-336)
9. Cancel Context (lines 338-340)
10. Log completion (line 343)
Note: If StartAgentMode() is called, graceful shutdown manager handles cleanup automatically.
Helper Types
SimpleLogger
// Lines 44-57 in shared.go
type SimpleLogger struct{}
func (l *SimpleLogger) Info(msg string, args ...interface{})
func (l *SimpleLogger) Warn(msg string, args ...interface{})
func (l *SimpleLogger) Error(msg string, args ...interface{})
Purpose: Basic logging implementation for runtime components
Output: Uses log.Printf() with level prefixes
SimpleTaskTracker
// Lines 59-106 in shared.go
type SimpleTaskTracker struct {
maxTasks int
activeTasks map[string]bool
decisionPublisher *ucxl.DecisionPublisher
}
Methods:
| Method | Purpose |
|---|---|
GetActiveTasks() []string |
Returns list of active task IDs |
GetMaxTasks() int |
Returns max concurrent tasks |
AddTask(taskID string) |
Marks task as active |
RemoveTask(taskID string) |
Marks task complete, publishes decision |
Decision Publishing:
- When task completes, publishes to DHT via UCXL
- Only if
decisionPublisheris set - Includes: task ID, success status, summary, modified files
AI Provider Configuration
Function: initializeAIProvider()
// Lines 620-686 in shared.go
func initializeAIProvider(cfg *config.Config, logger *SimpleLogger) error
Supported Providers:
-
ResetData (lines 627-640)
reasoning.SetAIProvider("resetdata") reasoning.SetResetDataConfig(reasoning.ResetDataConfig{ BaseURL: cfg.AI.ResetData.BaseURL, APIKey: cfg.AI.ResetData.APIKey, Model: cfg.AI.ResetData.Model, Timeout: cfg.AI.ResetData.Timeout, }) -
Ollama (lines 642-644)
reasoning.SetAIProvider("ollama") reasoning.SetOllamaEndpoint(cfg.AI.Ollama.Endpoint) -
Default (lines 646-660)
- Falls back to ResetData if unknown provider
- Logs warning
Model Configuration (lines 662-667):
reasoning.SetModelConfig(
cfg.Agent.Models,
cfg.Agent.ModelSelectionWebhook,
cfg.Agent.DefaultReasoningModel,
)
Prompt Initialization (lines 669-683):
- Read prompts from
CHORUS_PROMPTS_DIR - Read default instructions from
CHORUS_DEFAULT_INSTRUCTIONS_PATH - Compose role-specific system prompt if role configured
- Fall back to default instructions if no role
SHHH Integration
Audit Sink
// Lines 609-618 in shared.go
type shhhAuditSink struct {
logger *SimpleLogger
}
func (s *shhhAuditSink) RecordRedaction(_ context.Context, event shhh.AuditEvent)
Purpose: Logs all SHHH redaction events
Log Format:
[WARN] 🔒 SHHH redaction applied (rule=api_key severity=high path=/workspace/data/config.json)
Findings Observer
// Lines 600-607 in shared.go
func (r *SharedRuntime) handleShhhFindings(ctx context.Context, findings []shhh.Finding)
Purpose: Records SHHH findings in metrics
Implementation:
for _, finding := range findings {
r.Metrics.IncrementSHHHFindings(
finding.Rule,
string(finding.Severity),
finding.Count,
)
}
Configuration Integration
Environment Loading
Performed in Initialize() (line 149):
cfg, err := config.LoadFromEnvironment()
See: pkg/config documentation for complete environment variable reference
Assignment Loading
Dynamic Assignment (lines 160-176):
if assignURL := os.Getenv("ASSIGN_URL"); assignURL != "" {
runtime.Logger.Info("📡 Loading assignment from WHOOSH: %s", assignURL)
ctx, cancel := context.WithTimeout(runtime.Context, 10*time.Second)
if err := runtime.RuntimeConfig.LoadAssignment(ctx, assignURL); err != nil {
runtime.Logger.Warn("⚠️ Failed to load assignment: %v", err)
} else {
runtime.Logger.Info("✅ Assignment loaded successfully")
}
cancel()
// Start reload handler for SIGHUP
runtime.RuntimeConfig.StartReloadHandler(runtime.Context, assignURL)
}
SIGHUP Reload:
- Send
kill -HUP <pid>to reload assignment - No restart required
- Updates: bootstrap peers, role, expertise, max tasks, etc.
Usage Examples
Example 1: Basic Initialization (Agent)
package main
import (
"fmt"
"os"
"chorus/internal/runtime"
)
func main() {
// Set build info
runtime.AppVersion = "1.0.0"
runtime.AppCommitHash = "abc123"
runtime.AppBuildDate = "2025-09-30"
// Initialize runtime
rt, err := runtime.Initialize("agent")
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to initialize: %v\n", err)
os.Exit(1)
}
defer rt.Cleanup()
// Start agent mode (blocks until shutdown)
if err := rt.StartAgentMode(); err != nil {
fmt.Fprintf(os.Stderr, "Agent mode failed: %v\n", err)
os.Exit(1)
}
}
Example 2: Custom HAP Mode
func main() {
runtime.AppVersion = "1.0.0"
rt, err := runtime.Initialize("hap")
if err != nil {
fmt.Fprintf(os.Stderr, "Failed to initialize: %v\n", err)
os.Exit(1)
}
defer rt.Cleanup()
// HAP mode: manual interaction instead of StartAgentMode()
terminal := hapui.NewTerminalInterface(rt)
if err := terminal.Start(); err != nil {
fmt.Fprintf(os.Stderr, "Terminal failed: %v\n", err)
os.Exit(1)
}
}
Example 3: Accessing Components
func main() {
rt, _ := runtime.Initialize("agent")
defer rt.Cleanup()
// Access initialized components
nodeID := rt.Node.ID().ShortString()
fmt.Printf("Node ID: %s\n", nodeID)
// Publish custom message
rt.PubSub.Publish("chorus/custom", []byte("hello"))
// Store data in DHT
if rt.EncryptedStorage != nil {
rt.EncryptedStorage.Put(context.Background(), "key", []byte("value"))
}
// Check if this node is admin
if rt.ElectionManager.IsAdmin() {
fmt.Println("This node is admin")
}
// Start agent behaviors
rt.StartAgentMode()
}
Implementation Status
| Feature | Status | Notes |
|---|---|---|
| Initialization | ✅ Production | Complete initialization flow |
| Configuration Loading | ✅ Production | Environment + assignments |
| License Validation | ✅ Production | KACHING integration |
| P2P Node Setup | ✅ Production | libp2p, mDNS, DHT |
| PubSub Initialization | ✅ Production | Topic subscriptions |
| Election System | ✅ Production | Democratic election |
| DHT Storage | ✅ Production | Encrypted distributed storage |
| Task Coordination | ✅ Production | Work distribution |
| HTTP API Server | ✅ Production | REST endpoints |
| UCXI Server | 🔶 Beta | Optional content resolution |
| Health Monitoring | ✅ Production | Liveness & readiness |
| Graceful Shutdown | ✅ Production | Dependency-ordered cleanup |
| BACKBEAT Integration | 🔶 Beta | Optional P2P telemetry |
| SHHH Sentinel | ✅ Production | Secrets detection |
| Metrics Collection | ✅ Production | Prometheus format |
| Agent Mode | ✅ Production | Autonomous behaviors |
| Availability Broadcasting | ✅ Production | Every 30s |
| Capabilities Broadcasting | ✅ Production | On startup |
| Role Broadcasting | ✅ Production | On startup if configured |
| SIGHUP Reload | ✅ Production | Dynamic reconfiguration |
| Live Capability Updates | ❌ TODO | Re-broadcast on config change |
Error Handling
Critical Errors (Fatal)
These errors cause immediate exit:
-
Configuration Loading Failure (line 151)
❌ Configuration error: <details> -
License Validation Failure (line 189)
❌ License validation failed: <details> -
P2P Node Creation Failure (line 234)
❌ Failed to create P2P node: <details> -
PubSub Initialization Failure (line 264)
❌ Failed to create PubSub: <details>
Non-Critical Errors (Warnings)
These errors log warnings but allow startup to continue:
-
Assignment Loading Failure (line 166)
⚠️ Failed to load assignment (continuing with base config): <details> -
BACKBEAT Initialization Failure (line 219)
⚠️ BACKBEAT integration initialization failed: <details> 📍 P2P operations will run without beat synchronization -
DHT Bootstrap Failure (line 426)
⚠️ DHT bootstrap failed: <details> -
Bootstrap Peer Connection Failure (line 473)
⚠️ Failed to connect to bootstrap peer <addr>: <details> -
UCXI Storage Creation Failure (line 572)
⚠️ Failed to create UCXI storage: <details>
Related Documentation
- Commands: chorus-agent - Uses Initialize("agent")
- Commands: chorus-hap - Uses Initialize("hap")
- pkg/config - Configuration structures
- pkg/health - Health monitoring
- pkg/shutdown - Graceful shutdown
- pkg/election - Leader election
- pkg/dht - Distributed hash table
- internal/licensing - License validation
- internal/backbeat - P2P telemetry
Summary
The internal/runtime package is the backbone of CHORUS:
✅ Single Initialization: All binaries use same initialization path ✅ Component Lifecycle: Consistent startup, operation, shutdown ✅ Health Monitoring: Liveness, readiness, and enhanced checks ✅ Graceful Shutdown: Dependency-ordered cleanup with timeouts ✅ Dynamic Configuration: SIGHUP reload without restart ✅ Agent Behaviors: Availability, capabilities, role broadcasting ✅ Security Integration: License validation, secrets detection ✅ P2P Foundation: libp2p, DHT, PubSub, Election, Coordination
This package ensures consistent, reliable, and production-ready initialization for all CHORUS components.