JuliusBrussee/caveman · error
native pack: invalid skill %q
Error message
native pack: invalid skill %q
What it means
A skill inside a native pack failed structural validation: it has an empty or duplicate ID, an activation other than "classified", empty instructions, or instructions longer than its prompt byte budget, so the pack cannot be loaded.
Source
Thrown at proxy/internal/nativepack/pack.go:102
}
}
}
}
return selected, found
}
func validate(pack Pack) error {
if pack.Schema != "caveman.native-pack.v1" || pack.ID == "" || pack.Version == "" || pack.Protocol < 1 {
return errors.New("native pack: invalid identity")
}
if !pack.Core.Mandatory || pack.Core.Instructions == "" || pack.Core.EstimatedTokens > pack.Core.PromptTokenBudget {
return errors.New("native pack: invalid Core budget or instructions")
}
owners := map[string][]Skill{}
ids := map[string]bool{}
for _, skill := range pack.Skills {
if skill.ID == "" || ids[skill.ID] || skill.Activation != "classified" || skill.Instructions == "" || len(skill.Instructions) > skill.PromptByteBudget {
return fmt.Errorf("native pack: invalid skill %q", skill.ID)
}
ids[skill.ID] = true
for _, taskType := range skill.TaskTypes {
owners[taskType] = append(owners[taskType], skill)
}
}
for _, skill := range pack.Skills {
for _, conflict := range skill.Conflicts {
if !ids[conflict] {
return fmt.Errorf("native pack: %s conflicts with unknown skill %s", skill.ID, conflict)
}
}
}
for taskType, candidates := range owners {
for left := 0; left < len(candidates); left++ {
for right := left + 1; right < len(candidates); right++ {
a, b := candidates[left], candidates[right]
if !contains(a.Conflicts, b.ID) || !contains(b.Conflicts, a.ID) || a.Precedence == b.Precedence {View on GitHub (pinned to 766dce6b13)
Solutions
- Give each skill a unique non-empty ID and set activation to "classified"
- Ensure instructions are non-empty and fit within skill.prompt_byte_budget
- Rebuild/repack the native pack so it conforms to caveman.native-pack.v1
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at proxy/internal/nativepack/pack.go:102 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of JuliusBrussee/caveman@766dce6b13 (2026-08-18).
Data as JSON: /api/errors/dc51412afb2b6efa.
Report an issue: GitHub.