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>
117 lines
5.9 KiB
JSON
117 lines
5.9 KiB
JSON
{
|
|
"meta": {
|
|
"id": "agile-agent-team",
|
|
"title": "Agile AI Agent Team",
|
|
"subtitle": "Knowledge Coordination with Episteme",
|
|
"version": "4.0.0"
|
|
},
|
|
"actors": {},
|
|
"slides": [
|
|
{
|
|
"type": "title",
|
|
"id": "title"
|
|
},
|
|
{
|
|
"type": "hook",
|
|
"id": "hook",
|
|
"line": "Your agents have amnesia.",
|
|
"subline": "Every correction you make is forgotten by the next session."
|
|
},
|
|
{
|
|
"type": "code",
|
|
"id": "drift-logging",
|
|
"title": "Day 1: You correct the agent",
|
|
"code": "// Agent used console.log\n// You: \"We use winston, not console.log\"\n\nimport { logger } from './logger';\n\nlogger.info('User authenticated', { userId });\n"
|
|
},
|
|
{
|
|
"type": "code",
|
|
"id": "drift-logging-2",
|
|
"title": "Day 30: New session",
|
|
"code": "// Agent writes new code...\n\nconsole.log('User authenticated');\nconsole.log('userId:', userId);\n\n// The correction from Day 1? Gone.\n"
|
|
},
|
|
{
|
|
"type": "code",
|
|
"id": "drift-http",
|
|
"title": "Day 45: You correct again",
|
|
"code": "// Agent used axios\n// You: \"We standardized on fetch\"\n\nconst response = await fetch('/api/users', {\n headers: { 'Authorization': `Bearer ${token}` }\n});\n"
|
|
},
|
|
{
|
|
"type": "code",
|
|
"id": "drift-http-2",
|
|
"title": "Day 60: Another new session",
|
|
"code": "// Agent writes new code...\n\nimport axios from 'axios';\n\nconst response = await axios.get('/api/users', {\n headers: { 'Authorization': `Bearer ${token}` }\n});\n\n// Forgot again. Different session, different choices.\n"
|
|
},
|
|
{
|
|
"type": "code",
|
|
"id": "spiral",
|
|
"title": "6 months later: 10 ways to do 1 thing",
|
|
"code": "// Logging\nconsole.log() // 47 files\nwinston.info() // 23 files\npino.info() // 12 files\ndebug() // 8 files\n\n// HTTP\nfetch() // 31 files\naxios.get() // 28 files\ngot() // 6 files\n\n// Auth\nRS256 // 4 services\nES256 // 3 services\nHS256 // 2 services (why??)\n"
|
|
},
|
|
{
|
|
"type": "hook",
|
|
"id": "spiral-question",
|
|
"line": "Which one is correct?",
|
|
"subline": "Nobody knows. The decision was never recorded."
|
|
},
|
|
{
|
|
"type": "code",
|
|
"id": "catastrophe",
|
|
"title": "The Catastrophe",
|
|
"code": "// Auth service A expects RS256\n// Auth service B was deployed with ES256\n// An agent queried \"what's our JWT algorithm?\"\n// Got the most recent answer: ES256 (from an RFC proposal)\n\nHTTP 401 Unauthorized\n{\n error: \"invalid_signature\",\n expected: \"RS256\",\n received: \"ES256\"\n}\n\n// 3:00 AM. Pager fires. 47-minute outage.\n"
|
|
},
|
|
{
|
|
"type": "code",
|
|
"id": "catastrophe-why",
|
|
"title": "The Root Cause",
|
|
"code": "// The RFC was stored without lifecycle state\n// The query returned the most recent entry\n// No way to distinguish \"proposed\" from \"approved\"\n// The agent treated an idea as truth\n\n// And now you have to audit 9 services\n// to figure out which JWT algorithm is actually correct.\n"
|
|
},
|
|
{
|
|
"type": "hook",
|
|
"id": "fix-intro",
|
|
"line": "What if corrections persisted?",
|
|
"subline": "Across sessions. Across agents. Forever."
|
|
},
|
|
{
|
|
"type": "code",
|
|
"id": "fix-store",
|
|
"title": "Store decisions with context",
|
|
"code": "episteme.assert({\n subject: \"project/logging\",\n predicate: \"library\",\n value: \"winston\",\n\n lifecycle: \"approved\", // not proposed, not deprecated\n confidence: 1.0, // this is a decision, not a guess\n source: \"adr-0012\" // traceable to a decision record\n});\n"
|
|
},
|
|
{
|
|
"type": "code",
|
|
"id": "fix-query",
|
|
"title": "Query with lifecycle filter",
|
|
"code": "// Before writing code, agent checks constraints\n\nconst constraints = await episteme.query({\n subject: \"project/logging\",\n lifecycle: \"approved\"\n});\n\n// Returns: { library: \"winston\", confidence: 1.0 }\n\n// Agent uses winston. Every time. Every session.\n"
|
|
},
|
|
{
|
|
"type": "code",
|
|
"id": "fix-diff",
|
|
"title": "The difference",
|
|
"code": "// Without Episteme:\nquery({ subject: \"auth/jwt\", predicate: \"algorithm\" })\n// Returns: ES256 (most recent entry - a proposal)\n\n// With Episteme:\nquery({ subject: \"auth/jwt\", predicate: \"algorithm\", lifecycle: \"approved\" })\n// Returns: RS256 (the actual decision)\n"
|
|
},
|
|
{
|
|
"type": "code",
|
|
"id": "time-travel",
|
|
"title": "Debug what you believed, not what you know now",
|
|
"code": "// Post-incident: what did we believe at 9pm?\n\nepisteme.query({\n subject: \"auth/jwt\",\n predicate: \"algorithm\",\n as_of: \"2024-01-15T21:00:00Z\"\n});\n\n// Returns: ES256 (the belief at incident time)\n\nepisteme.diff({\n subject: \"auth/jwt\",\n from: \"2024-01-15T14:00:00Z\",\n to: \"2024-01-15T21:00:00Z\"\n});\n\n// Shows: RFC proposal added at 2:32pm\n// Root cause identified.\n"
|
|
},
|
|
{
|
|
"type": "code",
|
|
"id": "correction",
|
|
"title": "Fix the record, not just the code",
|
|
"code": "// Mark the bad assertion\nepisteme.supersede({\n target: \"ax7f3k9...\",\n reason: \"RFC was proposal, not approved decision\",\n corrected_by: \"sre-oncall\"\n});\n\n// Add a constraint so it never happens again\nepisteme.assert({\n subject: \"auth/jwt\",\n predicate: \"algorithm\",\n value: \"RS256\",\n lifecycle: \"approved\",\n supersedes: \"ax7f3k9...\"\n});\n\n// Future sessions will see this. Forever.\n"
|
|
},
|
|
{
|
|
"type": "vision",
|
|
"id": "vision",
|
|
"title": "Episteme",
|
|
"points": [
|
|
"Claims, not facts. Uncertainty is first-class.",
|
|
"Lifecycle awareness. Proposals ≠ decisions.",
|
|
"Corrections that persist across sessions.",
|
|
"Time travel for incident investigation."
|
|
],
|
|
"tagline": "Git for Truth"
|
|
}
|
|
]
|
|
} |