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>
417 lines
9.1 KiB
Markdown
417 lines
9.1 KiB
Markdown
# StemeDB ADK-Go Integration
|
|
|
|
ADK-Go tool wrappers for integrating AI agents with Episteme (StemeDB) using Google's Agent Development Kit.
|
|
|
|
## Overview
|
|
|
|
This package provides:
|
|
|
|
- **Tool Definitions**: Query, Assert, ConstraintCheck, Trace, Supersede
|
|
- **Callback Helpers**: Confidence escalation, constraint enforcement, audit logging
|
|
- **Agent Configuration**: Pre-configured setups for standard agent types
|
|
|
|
## Installation
|
|
|
|
```bash
|
|
go get github.com/orchard9/stemedb-go/adk
|
|
```
|
|
|
|
## Quick Start
|
|
|
|
```go
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"log"
|
|
|
|
"github.com/orchard9/stemedb-go/adk"
|
|
"github.com/orchard9/stemedb-go/steme"
|
|
)
|
|
|
|
func main() {
|
|
// Create StemeDB client
|
|
signer, _ := steme.GenerateSigner()
|
|
client := steme.NewClient("http://localhost:3000", signer)
|
|
|
|
// Get all Episteme tools
|
|
tools := adk.AllTools(client)
|
|
|
|
// Or get pre-configured agent setups
|
|
configs := adk.AllConfigs(
|
|
client,
|
|
0.8, // confidence threshold
|
|
setState,
|
|
log.Printf,
|
|
)
|
|
|
|
// Use with your ADK agent
|
|
// agent := configureAgent(configs["implementation"])
|
|
}
|
|
|
|
func setState(key string, value interface{}) {
|
|
// Store session state
|
|
}
|
|
```
|
|
|
|
## Tools
|
|
|
|
### Query Tool
|
|
|
|
Query Episteme with lens-based conflict resolution.
|
|
|
|
```go
|
|
tool := adk.NewQueryTool(client)
|
|
|
|
input := adk.QueryInput{
|
|
Subject: "auth/jwt",
|
|
Predicate: "signing_algorithm",
|
|
Lens: "authority",
|
|
Lifecycle: "approved",
|
|
MinConfidence: 0.8,
|
|
}
|
|
|
|
// Execute returns QueryOutput with resolved value
|
|
```
|
|
|
|
**Critical Rules:**
|
|
- Always filter by `lifecycle=approved` for production decisions
|
|
- Check confidence thresholds before acting
|
|
- Use appropriate lens (authority, consensus, recency)
|
|
|
|
### Assert Tool
|
|
|
|
Store knowledge with lifecycle and confidence.
|
|
|
|
```go
|
|
tool := adk.NewAssertTool(client)
|
|
|
|
input := adk.AssertInput{
|
|
Subject: "Tesla_Inc",
|
|
Predicate: "has_revenue",
|
|
Object: 96.7,
|
|
SourceHash: "0000...0000", // BLAKE3 hash of evidence
|
|
Confidence: 0.95,
|
|
Lifecycle: "proposed", // Default to proposed
|
|
}
|
|
|
|
// Execute returns AssertOutput with content-addressed hash
|
|
```
|
|
|
|
**Critical Rules:**
|
|
- Always include `source_hash` for provenance
|
|
- Use confidence to express uncertainty (0.0-1.0)
|
|
- Default to `lifecycle=proposed` (not approved)
|
|
- Store conflicting sources without resolving
|
|
|
|
### Constraint Check Tool
|
|
|
|
Pre-flight validation for Implementation Agent.
|
|
|
|
```go
|
|
tool := adk.NewConstraintCheckTool(client)
|
|
|
|
input := adk.ConstraintCheckInput{
|
|
Context: "auth_jwt",
|
|
}
|
|
|
|
// Execute returns ConstraintCheckOutput with must-use and forbidden patterns
|
|
```
|
|
|
|
**Critical Rules:**
|
|
- Implementation Agent MUST call before code generation
|
|
- Returns both positive (must_use) and negative (forbidden) constraints
|
|
- Enables contrastive learning ("use X, not Y, because Z")
|
|
|
|
### Trace Tool
|
|
|
|
Audit trail queries for incident investigation.
|
|
|
|
```go
|
|
tool := adk.NewTraceTool()
|
|
|
|
input := adk.TraceInput{
|
|
AgentID: "deployment-agent",
|
|
From: "-6h",
|
|
Subject: "auth/*",
|
|
}
|
|
|
|
// Execute returns TraceOutput with query history
|
|
```
|
|
|
|
**Use Cases:**
|
|
- On-Call SRE: "What did the agent query during the incident?"
|
|
- Human Supervisor: "What values did the agent see at that time?"
|
|
- Incident investigation: Sub-second trace queries
|
|
|
|
### Supersede Tool
|
|
|
|
Error correction with cascade tracking.
|
|
|
|
```go
|
|
tool := adk.NewSupersedeTool()
|
|
|
|
input := adk.SupersedeInput{
|
|
Hash: "bad_assertion_hash",
|
|
Reason: "Proposal treated as approved",
|
|
Type: "Invalidate",
|
|
}
|
|
|
|
// Execute returns SupersedeOutput with affected assertions
|
|
```
|
|
|
|
**Use Cases:**
|
|
- Correct bad assertions
|
|
- Track downstream impact
|
|
- Incident remediation
|
|
|
|
## Callbacks
|
|
|
|
### Constraint Enforcement
|
|
|
|
Enforce constraints before code generation.
|
|
|
|
```go
|
|
callback := adk.ConstraintEnforcementCallback(client, []string{
|
|
"write_code",
|
|
"generate_config",
|
|
})
|
|
|
|
// Use in agent config
|
|
agent.BeforeToolCallback = callback
|
|
```
|
|
|
|
Blocks code generation if forbidden patterns would be used.
|
|
|
|
### Confidence Escalation
|
|
|
|
Escalate to human when confidence is too low.
|
|
|
|
```go
|
|
callback := adk.ConfidenceEscalationCallback(0.8, setState)
|
|
|
|
// Use in agent config
|
|
agent.AfterToolCallback = callback
|
|
```
|
|
|
|
Sets session state for human review when confidence < threshold.
|
|
|
|
### Audit Logging
|
|
|
|
Log all tool calls for debugging.
|
|
|
|
```go
|
|
callback := adk.AuditLoggingCallback(log.Printf)
|
|
|
|
// Use in agent config
|
|
agent.AfterToolCallback = callback
|
|
```
|
|
|
|
### Chaining Callbacks
|
|
|
|
Combine multiple callbacks.
|
|
|
|
```go
|
|
beforeCallback := adk.ChainBeforeCallbacks(
|
|
adk.ConstraintEnforcementCallback(client, codeGenTools),
|
|
customValidation,
|
|
)
|
|
|
|
afterCallback := adk.ChainAfterCallbacks(
|
|
adk.ConfidenceEscalationCallback(0.8, setState),
|
|
adk.AuditLoggingCallback(log.Printf),
|
|
)
|
|
```
|
|
|
|
## Agent Configurations
|
|
|
|
### Implementation Agent
|
|
|
|
Writes code against approved patterns only.
|
|
|
|
```go
|
|
config := adk.ConfigForImplementationAgent(client, log.Printf)
|
|
```
|
|
|
|
**Features:**
|
|
- Queries only approved patterns
|
|
- Checks constraints before code generation
|
|
- Blocks forbidden patterns
|
|
- Audit logging
|
|
|
|
**Workflow:**
|
|
1. Query approved pattern
|
|
2. Check constraints
|
|
3. Write code
|
|
4. Never use proposed/deprecated patterns
|
|
|
|
### Lead Orchestrator
|
|
|
|
Coordinates agent team based on knowledge state.
|
|
|
|
```go
|
|
config := adk.ConfigForLeadOrchestrator(
|
|
client,
|
|
0.8, // confidence threshold
|
|
setState,
|
|
log.Printf,
|
|
)
|
|
```
|
|
|
|
**Features:**
|
|
- Queries with appropriate lens
|
|
- Confidence threshold escalation
|
|
- Routes work to implementation or human
|
|
- Audit logging
|
|
|
|
**Workflow:**
|
|
1. Query current state
|
|
2. Check confidence
|
|
3. If high: route to implementation
|
|
4. If low: escalate to human
|
|
|
|
### Research Agent
|
|
|
|
Discovers and stores knowledge with source attribution.
|
|
|
|
```go
|
|
config := adk.ConfigForResearchAgent(client, log.Printf)
|
|
```
|
|
|
|
**Features:**
|
|
- Stores all sources (even conflicting)
|
|
- Expresses uncertainty via confidence
|
|
- Marks as proposed (not approved)
|
|
- Source provenance tracking
|
|
|
|
**Workflow:**
|
|
1. Research from multiple sources
|
|
2. Create assertion for each source
|
|
3. Don't resolve conflicts (store all)
|
|
4. Let orchestrator resolve via lens
|
|
|
|
### Human Supervisor
|
|
|
|
Investigates incidents and corrects knowledge.
|
|
|
|
```go
|
|
config := adk.ConfigForHumanSupervisor(client, log.Printf)
|
|
```
|
|
|
|
**Features:**
|
|
- Time-travel queries (as_of parameter)
|
|
- Trace queries
|
|
- Supersede for corrections
|
|
- Approve proposed assertions
|
|
|
|
**Workflow:**
|
|
1. Time-travel to incident
|
|
2. Trace agent queries
|
|
3. Identify bad assertion
|
|
4. Supersede with correction
|
|
5. Verify fix
|
|
|
|
### On-Call SRE
|
|
|
|
Fast incident investigation via trace queries.
|
|
|
|
```go
|
|
config := adk.ConfigForOnCallSRE(client, log.Printf)
|
|
```
|
|
|
|
**Features:**
|
|
- Sub-second trace queries
|
|
- Fast read-only investigation
|
|
- Escalation to supervisor for corrections
|
|
|
|
**Workflow (under 10 minutes):**
|
|
1. Trace: What did agent query?
|
|
2. Diff: What changed?
|
|
3. Identify: Which assertion is bad?
|
|
4. Escalate: Flag for supervisor
|
|
|
|
## Agent Coordination Pattern
|
|
|
|
```go
|
|
// Create multi-agent pipeline
|
|
client := steme.NewClient("http://localhost:3000", signer)
|
|
|
|
configs := adk.AllConfigs(client, 0.8, setState, log.Printf)
|
|
|
|
// Research Agent: Discovers knowledge
|
|
researchAgent := configureAgent(configs["research"])
|
|
|
|
// Lead Orchestrator: Routes based on confidence
|
|
leadAgent := configureAgent(configs["lead"])
|
|
|
|
// Implementation Agent: Writes code
|
|
implAgent := configureAgent(configs["implementation"])
|
|
|
|
// Sequential pipeline
|
|
pipeline := sequentialAgent(researchAgent, leadAgent, implAgent)
|
|
```
|
|
|
|
## Session State vs. Episteme
|
|
|
|
| Use Case | Mechanism | Why |
|
|
|----------|-----------|-----|
|
|
| Agent handoff in pipeline | Session State + OutputKey | Ephemeral, same conversation |
|
|
| Permanent org knowledge | Episteme Assert | Persists across sessions |
|
|
| "What was decided here?" | Session State | Temporary |
|
|
| "What should agents know forever?" | Episteme + lifecycle:approved | Permanent |
|
|
| Agent decision audit | Episteme QueryAudit | Immutable, time-travel |
|
|
|
|
## Testing
|
|
|
|
```bash
|
|
cd sdk/go/adk
|
|
go test -v
|
|
```
|
|
|
|
Tests include:
|
|
- Tool execution with mock client
|
|
- Confidence threshold enforcement
|
|
- Constraint checking
|
|
- Config creation
|
|
- Lifecycle/lens parsing
|
|
|
|
## Interface-Based Design
|
|
|
|
Since ADK-Go is not yet publicly released, this package uses interface-based design:
|
|
|
|
```go
|
|
// Generic tool interface
|
|
type Tool interface {
|
|
Name() string
|
|
Description() string
|
|
Execute(ctx context.Context, input []byte) ([]byte, error)
|
|
}
|
|
|
|
// Generic client interface
|
|
type EpistemeClient interface {
|
|
Query(ctx context.Context, params steme.QueryParams) (*steme.QueryResult, error)
|
|
Assert(ctx context.Context, assertion steme.Assertion) (string, error)
|
|
}
|
|
```
|
|
|
|
This allows:
|
|
- Easy testing with mock clients
|
|
- Adaptation to any ADK implementation
|
|
- Standalone usage without ADK
|
|
|
|
## Examples
|
|
|
|
See `.claude/guides/integrations/adk-go-episteme.md` for complete examples:
|
|
|
|
- Multi-agent pipeline
|
|
- Confidence escalation
|
|
- Constraint enforcement
|
|
- Time-travel queries
|
|
- Incident investigation
|
|
|
|
## For More Information
|
|
|
|
- **Use case context**: [use-cases/agile-agent-team.md](../../../use-cases/agile-agent-team.md)
|
|
- **Integration guide**: [.claude/guides/integrations/adk-go-episteme.md](../../../.claude/guides/integrations/adk-go-episteme.md)
|
|
- **Base SDK**: [sdk/go/steme/](../steme/)
|