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

  1. Give each skill a unique non-empty ID and set activation to "classified"
  2. Ensure instructions are non-empty and fit within skill.prompt_byte_budget
  3. 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.