From idev
Instinct-based learning system that observes sessions via hooks and evolves patterns into skills/commands/agents. Use when the user asks about learned instincts, wants to analyze session patterns, sets up auto-learning or observation hooks, or runs /idev:instinct-status, /idev:instinct-export, /idev:instinct-import, or /idev:evolve.
How this skill is triggered — by the user, by Claude, or both
Slash command
/idev:auto-learningThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
A learning system that turns Claude Code sessions into reusable knowledge through atomic "instincts" - small learned behaviors with confidence scoring.
A learning system that turns Claude Code sessions into reusable knowledge through atomic "instincts" - small learned behaviors with confidence scoring.
An instinct is a small learned behavior:
---
id: prefer-functional-style
trigger: "when writing new functions"
confidence: 0.7
domain: "code-style"
source: "session-observation"
---
# Prefer Functional Style
## Action
Use functional patterns over classes when appropriate.
## Evidence
- Observed 5 instances of functional pattern preference
- User corrected class-based approach to functional on 2025-01-15
Properties:
Session Activity
│
│ PreToolUse/PostToolUse hooks (observe.sh → observe.py)
▼
┌─────────────────────────────────────────┐
│ observations.jsonl │
│ (tool calls + outcomes, redacted) │
└─────────────────────────────────────────┘
│
│ Observer loop (start-observer.sh, headless Haiku)
▼
┌─────────────────────────────────────────┐
│ instincts/personal/ │
│ atomic instincts with confidence │
└─────────────────────────────────────────┘
│
│ /idev:evolve clusters
▼
┌─────────────────────────────────────────┐
│ evolved/ │
│ skills / commands / agents │
└─────────────────────────────────────────┘
The observation hooks are pre-registered by the plugin's hooks/hooks.json (PreToolUse/PostToolUse, all tools) but off by default — observe.sh exits instantly unless the global opt-in flag ~/.claude/homunculus/enabled exists. Enable with:
/idev:hooks enable observer
Disable with /idev:hooks disable observer. No settings.json editing, takes effect immediately, and the toggle is global (observations span all projects).
observe.sh is a thin wrapper that pipes the hook JSON to observe.py (the canonical implementation). The pre/post argument tells it the hook phase; if omitted, it falls back to the hook_event_name field in the payload. The hook truncates inputs/outputs at 5000 chars, redacts secret-looking values, honors capture_tools/ignore_tools from config.json, and rotates observations.jsonl into observations.archive/ past max_file_size_mb.
mkdir -p ~/.claude/homunculus/{instincts/{personal,inherited},evolved/{agents,skills,commands}}
touch ~/.claude/homunculus/observations.jsonl
The observer runs in the background, analyzing observations every 5 minutes (and on SIGUSR1 from the hook). It only archives observations after a successful analysis that produced an instinct:
"${CLAUDE_PLUGIN_ROOT}/skills/auto-learning/agents/start-observer.sh" # start
"${CLAUDE_PLUGIN_ROOT}/skills/auto-learning/agents/start-observer.sh" status # check
"${CLAUDE_PLUGIN_ROOT}/skills/auto-learning/agents/start-observer.sh" stop # stop
scripts/instinct-cli.py manages the instinct store. Four plugin commands wrap it:
| Command | CLI invocation | Description |
|---|---|---|
/idev:instinct-status | instinct-cli.py status | Show all instincts with confidence, by domain |
/idev:instinct-export | instinct-cli.py export [--domain] [--min-confidence] [--output] | Export sanitized instincts for sharing |
/idev:instinct-import | instinct-cli.py import <file-or-url> [--dry-run] [--force] [--min-confidence] | Import instincts; updates existing ids in place |
/idev:evolve | instinct-cli.py evolve [--generate] | Print instinct clusters; Claude writes the evolved files |
Run it directly with:
python3 "${CLAUDE_PLUGIN_ROOT}/skills/auto-learning/scripts/instinct-cli.py" status
config.json (in this skill's directory) is the source of truth:
{
"version": "2.0",
"observation": {
"enabled": true,
"store_path": "~/.claude/homunculus/observations.jsonl",
"max_file_size_mb": 10,
"archive_after_days": 7,
"capture_tools": ["Edit", "Write", "Bash", "Read", "Grep", "Glob"],
"ignore_tools": ["TodoWrite"]
},
"instincts": {
"personal_path": "~/.claude/homunculus/instincts/personal/",
"inherited_path": "~/.claude/homunculus/instincts/inherited/",
"min_confidence": 0.3,
"auto_approve_threshold": 0.7,
"confidence_decay_rate": 0.02,
"max_instincts": 100
},
"observer": {
"enabled": false,
"model": "haiku",
"run_interval_minutes": 5,
"min_observations_to_analyze": 20,
"patterns_to_detect": [
"user_corrections",
"error_resolutions",
"repeated_workflows",
"tool_preferences",
"file_patterns"
]
},
"evolution": {
"cluster_threshold": 3,
"evolved_path": "~/.claude/homunculus/evolved/",
"auto_evolve": false
}
}
Field reference:
observation.enabled — master switch for the observation hook (false disables capture)observation.capture_tools — if non-empty, ONLY these tools are observedobservation.ignore_tools — tools never observed (checked before capture_tools)observation.max_file_size_mb — observations.jsonl rotates to the archive past this sizeobservation.archive_after_days — retention hint for archived observationsinstincts.min_confidence — floor for keeping an instinctinstincts.auto_approve_threshold — confidence at which an instinct applies without askinginstincts.confidence_decay_rate — weekly decay when a pattern stops being observedinstincts.max_instincts — cap on the instinct store; prune lowest-confidence firstobserver.enabled — whether the background observer should runobserver.min_observations_to_analyze — observations required before an analysis run (read by start-observer.sh)evolution.cluster_threshold — instincts required to form an evolution clusterevolution.auto_evolve — if true, evolution may be proposed without an explicit /idev:evolveYou can also disable capture entirely by creating ~/.claude/homunculus/disabled.
~/.claude/homunculus/
├── observations.jsonl # Current session observations
├── observations.archive/ # Rotated + processed observations
├── observer.log # Background observer log
├── instincts/
│ ├── personal/ # Auto-learned instincts
│ └── inherited/ # Imported from others
└── evolved/
├── agents/ # Evolved specialist agents
├── skills/ # Evolved skills
└── commands/ # Evolved commands
| Score | Meaning | Behavior |
|---|---|---|
| 0.3 | Tentative | Suggested but not enforced |
| 0.5 | Moderate | Applied when relevant |
| 0.7 | Strong | Auto-approved for application |
| 0.9 | Near-certain | Core behavior |
Confidence increases when a pattern is repeatedly observed, the user doesn't correct the behavior, or similar instincts from other sources agree.
Confidence decreases when the user explicitly corrects the behavior, the pattern isn't observed for extended periods (see confidence_decay_rate), or contradicting evidence appears.
Architecture inspired by the Homunculus continuous-learning project.
npx claudepluginhub theophiluschinomona/idev --plugin idevGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.