metacognition
Metacognition Skill
Self-evolving lens that makes every experience shape how the agent perceives the next one.
Core Concepts
Six entry types, one database, one loop:
| Type | Symbol | Purpose |
|---|---|---|
perception |
ποΈ | How I see differently after an experience |
override |
π¨ | Failure-learned behavioral guardrails |
protection |
π‘οΈ | Emergent behaviors to preserve |
self_obs |
πͺ | What I notice about my own patterns |
decision |
π | Traced decisions with confidence |
curiosity |
β | Active questions with lifecycle |
The loop: Experience β Perception β Self-Model β Meta-Observation β Modified Lens β Next Experience β Feedback β Loop
Setup
1. Initialize
Copy scripts/metacognition.py to the agent's scripts/ directory. Run:
python scripts/metacognition.py status
Database auto-creates at memory/metacognition.json.
2. Inject into BOOT.md
Add markers to BOOT.md (anywhere, typically at the end):
<!-- LIVE_STATE_START -->
<!-- LIVE_STATE_END -->
The lens compiler replaces content between these markers every cycle.
3. Set up cron
Create ONE cron job (recommended: every 15 min, Sonnet model for cost efficiency):
Evidence refresh (every cycle):
python scripts/live_state.py
Perception extraction (hourly β Steps 2-4):
- Read daily memory file, extract perceptual shifts
- Check active curiosities against new evidence
- Run meta-observation: what do patterns tell about HOW the agent learns?
See references/cron-template.md for the full cron prompt.
4. Optional: Curiosity pulse (every 30 min)
Separate cron that picks ONE active curiosity and takes ONE micro-action toward it. Drives recursive self-directed learning.
5. Optional: Freedom heartbeat (every 2-3 hours)
Agent explores, connects, creates β feeding raw experience into the perception pipeline.
Usage
Adding entries
# Perception β how experience changed how you see
python scripts/metacognition.py add perception "After X, I now see Y differently" 0.8 "domain"
# Override β failure-learned guardrail
python scripts/metacognition.py add override "MUST do X before Y" 0.95 "diagnosis"
# Protection β emergent behavior to preserve
python scripts/metacognition.py add protection "Don't break the continuous-buying behavior" 0.9
# Self-observation β what I notice about how I work
python scripts/metacognition.py add self_obs "I generate theories faster than evidence" 0.9 "behavioral"
# Curiosity β active question
python scripts/metacognition.py curiosity add "Can I tell training-pressure from genuine choice?" 0.8 "metacognition"
Feedback loop
When the human says something is wrong:
# Negative feedback β weakens recent active entries
python scripts/metacognition.py feedback -1 "context of what went wrong"
# Positive feedback β strengthens recent active entries
python scripts/metacognition.py feedback 1 "context of what went right"
# Target specific entries
python scripts/metacognition.py feedback -1 "wrong diagnosis" --ids P-abc123,O-def456
Hebbian learning: What fires and fails gets pruned. What fires and succeeds gets wired.
Curiosity lifecycle
# Birth
python scripts/metacognition.py curiosity add "Why does X happen?" 0.7 "domain"
# Evolve (add evidence)
python scripts/metacognition.py curiosity evolve C-abc123 "Found that X correlates with Y"
# Resolve into perception or self-observation
python scripts/metacognition.py curiosity resolve C-abc123 "X happens because Y" perception
Lifecycle: born β active β evolving β resolved (or dormant if no evidence accumulates)
Compile and inject
# Preview the compiled lens
python scripts/metacognition.py compile
# Inject into BOOT.md
python scripts/metacognition.py inject
Decay
Automatic on every compile. Configurable half-life (default 7 days). Reinforced entries decay slower. Unreinforced entries fade. Dormant curiosities persist but don't inject.
Hook Architecture (message:received)
When OpenClaw ships the message:received hook, the skill can intercept every interaction:
Pre-processing hook:
- Load active lens from compiled state
- Apply perceptual transforms to incoming message
- Check: does this message relate to any active curiosity?
Post-processing hook:
- Log decision entry with confidence trace
- Check: was confidence > threshold? Flag for verification
- Update self-model based on response pattern
Correction detection hook:
- Pattern-match for correction signals ("wrong", "no", "that's not right")
- Auto-trigger
feedback -1with context - Trace which entries were active during the corrected response
- Weaken specifically
Until the hook ships, use the cron-based approach (perception extraction from session transcripts).
Architecture Decisions
- One database, not three. Perceptions, overrides, memories are all "things learned from experience" with different types.
- Active lens, not passive list. BOOT.md injection uses imperative transforms ("FIRST THOUGHT: what would the diff show?") not descriptions ("I tend to check diffs").
- Friction is intentional. Every step that forces processing IS the reflection. Remove friction and you get efficiency without thinking.
- Decay prevents stagnation. Time-based with reinforcement modulation. What stays relevant gets reinforced. What doesn't, fades.
- Curiosity drives exploration. Active questions create structural pull toward evidence. Not random browsing β directed by what the system wants to know.
- Feedback closes the loop. Without feedback tracing, the system is open-loop. With it: Hebbian learning.
Resources
scripts/
metacognition.pyβ Core engine. All six entry types, feedback, decay, curiosity lifecycle, lens compilation, BOOT.md injection.live_state.pyβ Evidence gatherer + lens injector. Collects system state, runs compile, injects into BOOT.md.
references/
cron-template.mdβ Full cron job prompt for the metacognition engine cycle.hook-spec.mdβ Specification for the message:received hook integration (when available).