This commit adds the read path (Cortex) to complement the write path (Spine): ## Crates - stemedb-api: HTTP API with axum + utoipa OpenAPI - /v1/assert, /v1/query, /v1/epoch, /v1/skeptic, /v1/trace, /v1/audit - Metered endpoints with quota enforcement - Ed25519 signature verification - stemedb-lens: Truth resolution lenses - RecencyLens, ConsensusLens, ConfidenceLens - VoteAwareConsensusLens (Ballot Box pattern) - TrustAwareAuthorityLens (The Hive pattern) - SkepticLens (conflict analysis) - EpochAwareLens (paradigm-safe queries) - stemedb-query: Query engine with materialized views ## Storage Extensions - VoteStore: Vote aggregation with cached counts - TrustRankStore: Agent reputation with decay - AuditStore: Query audit trail - IndexStore: SP/P/S index structures - SupersessionStore: Epoch supersession chains ## SDKs - sdk/go/steme: Go HTTP client with Ed25519 signing - sdk/go/adk: ADK-Go tools for AI agents ## Documentation - Updated CLAUDE.md, architecture.md, roadmap.md - New ai-lookup entries for all services - Use case docs for consumer health intelligence - Arena roadmap for simulation advancement Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
265 lines
8.2 KiB
Go
265 lines
8.2 KiB
Go
package adk
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// AgentConfig represents configuration for an agent.
|
|
//
|
|
// This is a generic configuration structure that can be adapted
|
|
// to any ADK implementation.
|
|
type AgentConfig struct {
|
|
// Agent name
|
|
Name string
|
|
|
|
// Agent description
|
|
Description string
|
|
|
|
// System instruction
|
|
Instruction string
|
|
|
|
// Available tools
|
|
Tools []Tool
|
|
|
|
// Before tool callback
|
|
BeforeToolCallback BeforeToolCallback
|
|
|
|
// After tool callback
|
|
AfterToolCallback AfterToolCallback
|
|
}
|
|
|
|
// ConfigForImplementationAgent creates configuration for an Implementation Agent.
|
|
//
|
|
// Implementation Agent writes code against approved patterns only.
|
|
// It MUST check constraints before generating code.
|
|
//
|
|
// Example usage:
|
|
//
|
|
// client := steme.NewClient("http://localhost:3000", signer)
|
|
// config := adk.ConfigForImplementationAgent(client, logFunc)
|
|
func ConfigForImplementationAgent(client EpistemeClient, logFunc func(string, ...any)) AgentConfig {
|
|
tools := []Tool{
|
|
NewQueryTool(client),
|
|
NewConstraintCheckTool(client),
|
|
// Add your code generation tools here
|
|
}
|
|
|
|
return AgentConfig{
|
|
Name: "implementation_agent",
|
|
Description: "Writes code against current approved patterns",
|
|
Instruction: `You write code. Always use approved patterns only.
|
|
|
|
CRITICAL RULES:
|
|
1. Query Episteme with lifecycle=approved for patterns
|
|
2. Check constraints BEFORE writing code
|
|
3. Never use proposed or deprecated patterns
|
|
4. If no approved pattern exists, escalate to human
|
|
|
|
Example workflow:
|
|
1. Query for approved pattern: episteme_query(subject="auth/jwt", predicate="signing_algorithm", lifecycle="approved")
|
|
2. Check constraints: episteme_constraint_check(context="auth_jwt")
|
|
3. Write code using approved pattern and respecting constraints`,
|
|
|
|
Tools: tools,
|
|
|
|
BeforeToolCallback: ConstraintEnforcementCallback(client, []string{
|
|
"write_code",
|
|
"generate_config",
|
|
"create_file",
|
|
}),
|
|
|
|
AfterToolCallback: AuditLoggingCallback(logFunc),
|
|
}
|
|
}
|
|
|
|
// ConfigForLeadOrchestrator creates configuration for a Lead Orchestrator.
|
|
//
|
|
// Lead Orchestrator queries Episteme for current state and routes work
|
|
// based on confidence thresholds.
|
|
//
|
|
// Example usage:
|
|
//
|
|
// config := adk.ConfigForLeadOrchestrator(client, 0.8, setState, logFunc)
|
|
func ConfigForLeadOrchestrator(
|
|
client EpistemeClient,
|
|
confidenceThreshold float32,
|
|
setState func(string, any),
|
|
logFunc func(string, ...any),
|
|
) AgentConfig {
|
|
tools := []Tool{
|
|
NewQueryTool(client),
|
|
// Add delegation tools here
|
|
}
|
|
|
|
return AgentConfig{
|
|
Name: "lead_orchestrator",
|
|
Description: "Coordinates agent team based on knowledge state",
|
|
Instruction: fmt.Sprintf(`You coordinate the agent team. Query Episteme for current state.
|
|
|
|
CRITICAL RULES:
|
|
1. Query with appropriate lens (authority, consensus, recency)
|
|
2. If confidence < %.2f, escalate to human supervisor
|
|
3. Only route to implementation if confidence is high
|
|
4. Always include lifecycle filter in queries
|
|
|
|
Example workflow:
|
|
1. Query current state: episteme_query(subject="task/xyz", predicate="status", lens="authority")
|
|
2. Check confidence score
|
|
3. If confidence >= %.2f: route to implementation agent
|
|
4. If confidence < %.2f: escalate to human supervisor`, confidenceThreshold, confidenceThreshold, confidenceThreshold),
|
|
|
|
Tools: tools,
|
|
|
|
AfterToolCallback: ChainAfterCallbacks(
|
|
ConfidenceEscalationCallback(confidenceThreshold, setState),
|
|
AuditLoggingCallback(logFunc),
|
|
),
|
|
}
|
|
}
|
|
|
|
// ConfigForResearchAgent creates configuration for a Research Agent.
|
|
//
|
|
// Research Agent discovers and stores knowledge with source attribution.
|
|
// It stores conflicting information without resolving it.
|
|
//
|
|
// Example usage:
|
|
//
|
|
// config := adk.ConfigForResearchAgent(client, logFunc)
|
|
func ConfigForResearchAgent(client EpistemeClient, logFunc func(string, ...any)) AgentConfig {
|
|
tools := []Tool{
|
|
NewAssertTool(client),
|
|
// Add search/research tools here
|
|
}
|
|
|
|
return AgentConfig{
|
|
Name: "research_agent",
|
|
Description: "Researches and stores knowledge with source attribution",
|
|
Instruction: `You research topics and store findings with source attribution.
|
|
|
|
CRITICAL RULES:
|
|
1. Always include source_hash for provenance
|
|
2. Use confidence to express uncertainty (0.0-1.0)
|
|
3. Mark conflicting sources - don't resolve them
|
|
4. Default to lifecycle=proposed (not approved)
|
|
5. Include context in meta.reason
|
|
|
|
Example workflow:
|
|
1. Research topic from multiple sources
|
|
2. For each source, create assertion:
|
|
episteme_assert(
|
|
subject="topic",
|
|
predicate="property",
|
|
object="value",
|
|
source_hash="<hash of source>",
|
|
confidence=0.8,
|
|
lifecycle="proposed",
|
|
)
|
|
3. Store ALL sources, even if they conflict
|
|
4. Let Lead Orchestrator resolve conflicts via lens`,
|
|
|
|
Tools: tools,
|
|
|
|
AfterToolCallback: AuditLoggingCallback(logFunc),
|
|
}
|
|
}
|
|
|
|
// ConfigForHumanSupervisor creates configuration for a Human Supervisor.
|
|
//
|
|
// Human Supervisor has access to time-travel queries, trace, and supersede.
|
|
// This is for incident investigation and knowledge correction.
|
|
//
|
|
// Example usage:
|
|
//
|
|
// config := adk.ConfigForHumanSupervisor(client, logFunc)
|
|
func ConfigForHumanSupervisor(client EpistemeClient, logFunc func(string, ...any)) AgentConfig {
|
|
tools := []Tool{
|
|
NewQueryTool(client),
|
|
NewAssertTool(client),
|
|
NewTraceTool(client),
|
|
NewSupersedeTool(client),
|
|
}
|
|
|
|
return AgentConfig{
|
|
Name: "human_supervisor",
|
|
Description: "Investigates incidents and corrects knowledge",
|
|
Instruction: `You investigate incidents and correct bad knowledge.
|
|
|
|
CRITICAL CAPABILITIES:
|
|
1. Time-travel queries: as_of parameter shows knowledge at specific time
|
|
2. Trace queries: see what an agent queried and when
|
|
3. Supersede: correct bad assertions with cascade tracking
|
|
4. Approve: promote proposed assertions to approved
|
|
|
|
Example incident investigation:
|
|
1. Time-travel to incident: episteme_query(subject="auth/jwt", predicate="signing_algorithm", as_of="2024-01-15T21:00:00Z")
|
|
2. Trace agent queries: episteme_trace(agent_id="deployment-agent", from="-6h", subject="auth/*")
|
|
3. Identify bad assertion from trace
|
|
4. Supersede: episteme_supersede(hash="<bad_hash>", reason="Proposal treated as approved", type="Invalidate")
|
|
5. Verify fix: episteme_query(subject="auth/jwt", predicate="signing_algorithm", lifecycle="approved")`,
|
|
|
|
Tools: tools,
|
|
|
|
AfterToolCallback: AuditLoggingCallback(logFunc),
|
|
}
|
|
}
|
|
|
|
// ConfigForOnCallSRE creates configuration for an On-Call SRE.
|
|
//
|
|
// On-Call SRE focuses on fast trace queries for incident response.
|
|
// Sub-second queries are critical.
|
|
//
|
|
// Example usage:
|
|
//
|
|
// config := adk.ConfigForOnCallSRE(client, logFunc)
|
|
func ConfigForOnCallSRE(client EpistemeClient, logFunc func(string, ...any)) AgentConfig {
|
|
tools := []Tool{
|
|
NewQueryTool(client),
|
|
NewTraceTool(client),
|
|
}
|
|
|
|
return AgentConfig{
|
|
Name: "oncall_sre",
|
|
Description: "Investigates production incidents via trace queries",
|
|
Instruction: `You investigate production incidents. Speed is critical.
|
|
|
|
CRITICAL WORKFLOW (under 10 minutes):
|
|
1. Trace: What did the agent query?
|
|
2. Diff: What changed recently?
|
|
3. Identify: Which assertion is bad?
|
|
4. Escalate: Flag for human supervisor to correct
|
|
|
|
Example 3am workflow:
|
|
1. Trace deployment agent: episteme_trace(agent_id="deployment-agent", from="-6h", subject="auth/*")
|
|
2. Find suspicious query in trace
|
|
3. Query current value: episteme_query(subject="auth/jwt", predicate="signing_algorithm", lifecycle="approved")
|
|
4. If value is wrong, escalate to human supervisor with trace evidence
|
|
|
|
DO NOT:
|
|
- Correct assertions yourself (escalate to supervisor)
|
|
- Make changes to production knowledge
|
|
- Skip the trace step`,
|
|
|
|
Tools: tools,
|
|
|
|
AfterToolCallback: AuditLoggingCallback(logFunc),
|
|
}
|
|
}
|
|
|
|
// AllConfigs returns configurations for all standard agent types.
|
|
//
|
|
// This is a convenience function for setting up a complete agent team.
|
|
func AllConfigs(
|
|
client EpistemeClient,
|
|
confidenceThreshold float32,
|
|
setState func(string, any),
|
|
logFunc func(string, ...any),
|
|
) map[string]AgentConfig {
|
|
return map[string]AgentConfig{
|
|
"implementation": ConfigForImplementationAgent(client, logFunc),
|
|
"lead": ConfigForLeadOrchestrator(client, confidenceThreshold, setState, logFunc),
|
|
"research": ConfigForResearchAgent(client, logFunc),
|
|
"supervisor": ConfigForHumanSupervisor(client, logFunc),
|
|
"oncall": ConfigForOnCallSRE(client, logFunc),
|
|
}
|
|
}
|