feat(skills): extract ironclaw_skills crate and integrate with v2 engine

Extract the skills system into a standalone `ironclaw_skills` crate
(following the ironclaw_safety pattern) and wire it into the v2 engine
for deterministic skill selection, CodeAct code injection, and
confidence tracking.

**ironclaw_skills crate** (94 tests):
- Core types: SkillManifest, ActivationCriteria, LoadedSkill, SkillTrust
- V2 types: V2SkillMetadata, CodeSnippet, SkillMetrics, V2SkillSource
- Deterministic 4-phase selector (gating→scoring→budget→attenuation)
- apply_confidence_factor() for extracted skill scoring
- SKILL.md parser, validation/escaping, gating, registry, catalog
- Feature-gated: catalog (reqwest), registry (filesystem)

**Engine integration** (14 new tests):
- DocType::Skill with retrieval weight 0.45
- SkillSelector bridges MemoryDoc→LoadedSkill for shared scoring
- SkillTracker for usage/version/rollback confidence tracking
- System prompt injection via <skill> XML blocks
- CodeAct snippet injection via Monty NameLookup
- Skill extraction mission replaces playbook extraction
- ThreadManager.set_skill_selector() for runtime wiring

**Bridge + migration**:
- skill_migration.rs: v1 SKILL.md → v2 MemoryDoc (idempotent)
- init_engine() migrates v1 skills, builds SkillSelector
- src/skills/mod.rs → re-export shim

**E2E test** (tests/engine_v2_skill_codeact.rs):
- Full CodeAct loop: skill selected → LLM returns Python code →
  Monty executes http() → mock returns canned GitHub JSON →
  FINAL() terminates → thread completes with canned data
- GitHub SKILL.md in skills/github/ as reference implementation

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
This commit is contained in:
2026-03-27 16:24:07 -07:00
co-authored by Claude Opus 4.6
parent a4f5c56d06
commit 8e2349d12e
33 changed files with 2780 additions and 575 deletions
Generated
+21
View File
@@ -3628,6 +3628,7 @@ dependencies = [
"ironclaw_common",
"ironclaw_engine",
"ironclaw_safety",
"ironclaw_skills",
"json5",
"libsql",
"lru",
@@ -3698,6 +3699,7 @@ version = "0.1.0"
dependencies = [
"async-trait",
"chrono",
"ironclaw_skills",
"monty",
"pretty_assertions",
"serde",
@@ -3720,6 +3722,25 @@ dependencies = [
"url",
]
[[package]]
name = "ironclaw_skills"
version = "0.1.0"
dependencies = [
"chrono",
"futures",
"regex",
"reqwest",
"serde",
"serde_json",
"serde_yml",
"sha2",
"tempfile",
"thiserror 2.0.18",
"tokio",
"tracing",
"urlencoding",
]
[[package]]
name = "is-docker"
version = "0.2.0"