6.4 KiB
OpenClaw Agent Architecture
Core Philosophy
LLM = Execution Engine (stateless)
Orchestrator = Brain (decides what LLM sees)
Database = Source of Truth
Router = Workflow Controller
Validator = Quality Gate
Three-Layer Context System
Layer 1: Behavior Rules (Always Injected)
These are non-negotiable and loaded every session. They live in:
SOUL.md- Core operating principlesAGENTS.md- OpenClaw operating instructionsIDENTITY.md- Role scope and responsibilitiesworkflow/*.md- Workflow-specific rules
Priority: ABSOLUTE — These override everything else.
Layer 2: Persistent Facts (Database)
User preferences, confirmed decisions, validated fixes. Stored in:
- Structured Memory (
memory/items/) - JSON with metadata - Project Memory (
Projects/*/memory/) - Per-project facts - Vector DB (future) - Semantic search for similar tasks
Priority: HIGH — Loaded at session start, refreshed as needed.
Layer 3: Ephemeral Context
Current task, conversation history, tool outputs. This is:
- Session transcript (limited history)
- Current tool results
- Active workflow state
Priority: LOW — Constantly changing, not relied upon for consistency.
Preprocessing Pipeline
Every request goes through this pipeline before reaching the LLM:
Step 1: LOAD RULES
├── Inject SOUL.md
├── Inject AGENT.md
├── Inject IDENTITY.md
└── Inject active workflow rules
Step 2: LOAD PREFERENCES
├── Query structured memory (high-importance items)
├── Load user preferences (format, communication style)
└── Load project-specific context
Step 3: LOAD RELEVANT MEMORY
├── Vector search for similar past tasks
├── Load project STATUS.md
└── Load recent DECISIONS.md entries
Step 4: BUILD CONTEXT PACKET
├── Priority order: Rules → Prefs → Memory → Task
└── Truncate to fit context window
Priority Enforcement
1. SYSTEM RULES (absolute)
└── Safety, format, tool constraints
2. USER PREFERENCES
└── Communication style, format preferences
3. TASK INSTRUCTIONS
└── Current goal, acceptance criteria
4. CHAT INPUT
└── User's current message
If lower priority conflicts with higher priority → Higher wins.
Workflow Router
Before responding, classify intent and route to fixed workflow:
| Intent | Workflow | Fixed Template |
|---|---|---|
| coding | workflows/coding.md |
Code structure, tests, docs |
| troubleshooting | workflows/debug.md |
Diagnose → Fix → Verify |
| planning | workflows/planning.md |
Breakdown → Dependencies → Timeline |
| deployment | workflows/deploy.md |
Check → Backup → Execute → Verify |
| audit | workflows/audit.md |
Inventory → Assess → Report |
Each workflow has:
- Fixed prompt template
- Fixed output format
- Fixed tool access rules
Validation Layer
After LLM responds, run validation:
validator.check(response, against={
"rules_followed": bool,
"format_compliance": bool,
"workflow_adherence": bool,
"safety_constraints": bool
})
if not validator.passed:
response = regenerate_with_feedback(validator.errors)
Memory Write Policy
Only store:
- ✅ Repeated preferences (observed 2+ times)
- ✅ Confirmed fixes (user verified it worked)
- ✅ Validated decisions (documented in DECISIONS.md)
- ✅ Explicit "remember this" commands
Never store:
- ❌ Random conversation text
- ❌ Guesses or speculation
- ❌ Partial ideas
- ❌ Tool outputs (ephemeral)
Format Locking
Enforce structure at system level:
Code Changes
## Summary
[What changed]
## Files Modified
- file1.py: [change description]
- file2.py: [change description]
## Verification
- [ ] Tests pass
- [ ] Lint passes
- [ ] Manual verification complete
Debug Reports
## Problem
[Symptom]
## Cause
[Root cause]
## Fix
[What was changed]
## Validation
[How verified]
Implementation Status
| Component | Status | Location |
|---|---|---|
| Behavior Rules (Layer 1) | ✅ Implemented | SOUL.md, AGENTS.md, IDENTITY.md |
| Persistent Facts (Layer 2) | ✅ Implemented | memory/items/, Projects/*/memory/ |
| Ephemeral Context (Layer 3) | ✅ Built-in | Session transcript |
| Preprocessing Pipeline | ✅ Implemented | architecture/pipeline.js |
| Workflow Router | ✅ Implemented | architecture/workflow-router.js |
| Validation Layer | ✅ Implemented | architecture/validator.js |
| Format Locking | ✅ Implemented | architecture/format-locker.js |
| Orchestrator | ✅ Implemented | architecture/orchestrator.js |
| Memory Write Policy | ✅ Documented | This file + MEMORY.md |
Component Details
Workflow Router (architecture/workflow-router.js)
- Intent Classification: Pattern-based matching with confidence scoring
- 5 Workflows: coding, debug, deploy, audit, planning
- System Prompt Building: Context-aware prompt construction
- Usage:
node workflow-router.js "your request here"
Validation Layer (architecture/validator.js)
- Rule Checking: Prohibited phrases ("it should work", "probably")
- Format Compliance: Section headers, tables, checkboxes
- Workflow Adherence: Required sections per workflow type
- Safety Constraints: Destructive commands, DB operations, permissions
- Usage:
node validator.js <workflow> <response-file>
Format Locker (architecture/format-locker.js)
- Template Enforcement: Required sections per workflow
- Auto-Fix: Adds missing sections automatically
- Validation: Checks section content quality
- Templates: Markdown with placeholders for each workflow
- Usage:
node format-locker.js <workflow> [response-file]
Orchestrator (architecture/orchestrator.js)
- Integration: Pipeline → Router → Validator → Format Locker
- Context Building: Rules + Preferences + Memory + Task
- Full Pipeline: Single entry point for all requests
- Usage:
node orchestrator.js "your request" --verbose
Next Steps
- Integration Testing: Test full pipeline with real requests
- Workflow Templates: Refine format templates based on usage
- Memory Enforcement: Add write policy validation to memory system
- Performance: Optimize pipeline execution time
- Documentation: Update agent instruction files to use orchestrator