Core deliverables: - Go module github.com/dtoro/oikos (Go 1.26.3) - cmd/oikos: single binary with role subcommands (migrate, seed, export) - 6 SQL migrations: ontology meta-schema, entity instances (UUID+slug, blast_radius recursive function), operations (signals/checks/approvals), cognition (classifications/executions/feedback/patterns/skills), policy, observability (TimescaleDB hypertables + CAGGs + retention) - Domain layer: entity, signal, execution, classification, pattern, skill, approval, check types + 11 sentinel errors + lifecycle state machines - DB layer: pgx pool, SQL splitter (handles 94436 and -- comments), migration runner, seed ingest (ontology+inventory+policy) with content-hash dedup - Config: env-based with defaults, secrets redaction - Observability: slog JSON logger with debug mode - Infrastructure: Makefile, docker-compose.yml, multi-stage Dockerfile (distroless, CGO_ENABLED=0) Verified end-to-end against timescale/timescaledb:2.17.2-pg16: - 6 migrations applied (65 SQL statements) - Seeds ingested: 6 lifecycles, 59 entity types, 46 relationship types, 111 entities, 144 relationships, 4 risk classes, 27 approval rules, 9 autonomy settings - Idempotent: second seed run is a no-op (content hash matches) Bugs fixed during implementation: - TimescaleDB CAGGs can't run in a transaction -> splitSQL() executes statements individually - Semicolons in -- comments treated as separators -> comment handling - YAML keys source/target didn't match code's source_type/target_type - yaml.Marshal produced YAML for JSONB columns -> json.Marshal
65 lines
1.5 KiB
Go
65 lines
1.5 KiB
Go
package domain
|
|
|
|
import "time"
|
|
|
|
// Classification persists every autonomous decision the classifier makes (SA5).
|
|
// This is the audit trail for "why did the OS auto-act / escalate?"
|
|
type Classification struct {
|
|
EntityID UUID
|
|
SignalEntityID UUID
|
|
TargetEntityID UUID
|
|
Action string
|
|
RecommendedAction map[string]any
|
|
RiskClass string
|
|
Route string
|
|
BlastRadius []UUID
|
|
PatternConfidence float64
|
|
SkillID UUID
|
|
AutonomyCheck string
|
|
Reasoning map[string]any
|
|
CorrelationID string
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
// Classification routes.
|
|
const (
|
|
RouteAutoAct = "auto-act"
|
|
RouteEscalate = "escalate"
|
|
RouteHold = "hold"
|
|
)
|
|
|
|
// Execution is a detailed record of one action the OS performed.
|
|
type Execution struct {
|
|
EntityID UUID
|
|
ClassificationID UUID
|
|
SignalEntityID UUID
|
|
TargetEntityID UUID
|
|
Action string
|
|
RiskClass string
|
|
ApprovalID UUID
|
|
AgentID UUID
|
|
SkillID UUID
|
|
SkillVersion int
|
|
Status string
|
|
Result map[string]any
|
|
DurationMs int
|
|
Verified bool
|
|
CorrelationID string
|
|
StartedAt *time.Time
|
|
CompletedAt *time.Time
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
// Execution lifecycle states.
|
|
const (
|
|
ExecProposed = "proposed"
|
|
ExecApproved = "approved"
|
|
ExecExecuting = "executing"
|
|
ExecVerified = "verified"
|
|
ExecFailed = "failed"
|
|
ExecTimedOut = "timed-out"
|
|
ExecRolledBack = "rolled-back"
|
|
ExecCancelled = "cancelled"
|
|
ExecExpired = "expired"
|
|
)
|