UAT: SkillIncludeSchema missing tool_overrides field — spec-required per-tool metadata overrides when including skills are not supported #2494

Open
opened 2026-04-03 18:39:10 +00:00 by freemo · 2 comments
Owner

Metadata

  • Branch: feat/skill-include-tool-overrides
  • Commit Message: feat(skills): add tool_overrides field to SkillIncludeSchema for per-tool metadata overrides
  • Milestone: v3.6.0
  • Parent Epic: #392

Summary

The specification defines a tool_overrides: field on skill includes: entries that allows overriding capability metadata for individual tools from an included skill. SkillIncludeSchema (in src/cleveragents/skills/schema.py) only has name and description fields — tool_overrides: is not supported. Skill YAML files using this spec feature will fail with extra="forbid".

Expected Behavior (from spec)

The specification (docs/specification.md, Skill Configuration section) shows:

skill:
  name: local/devops-toolkit
  
  includes:
    - local/file-ops           # Simple include
    - local/git-ops
    - name: local/github       # Include with per-tool overrides
      tool_overrides:
        - tool: local/create-github-issue
          override:
            capability:
              write_scope: [github:issues:org-only]

This allows a skill to include another skill while tightening or adjusting the capability metadata of specific tools from that included skill.

Actual Behavior

SkillIncludeSchema only supports name and description:

class SkillIncludeSchema(BaseModel):
    name: str = Field(...)
    description: str | None = Field(default=None)
    # ← No tool_overrides field!

A skill YAML with tool_overrides: on an include entry fails:

pydantic.ValidationError: 1 validation error for SkillIncludeSchema
tool_overrides
  Extra inputs are not permitted [type=extra_forbidden]

Partial Implementation in Domain Model

The SkillInclude domain model (src/cleveragents/domain/models/core/skill.py) has a generic overrides: dict[str, Any] | None field, but this is a flat dict — not the structured tool_overrides: [{tool: ..., override: {capability: {...}}}] format the spec requires. The SkillResolver applies these overrides as a shallow merge on all tools from the include, not as per-tool targeted overrides.

Code Locations

  • src/cleveragents/skills/schema.pySkillIncludeSchema missing tool_overrides field
  • src/cleveragents/domain/models/core/skill.pySkillInclude.overrides is a flat dict, not per-tool
  • src/cleveragents/domain/models/core/skill.pySkillResolver._resolve_recursive() applies overrides to all tools from an include, not per-tool

Subtasks

  • Add SkillToolOverrideSchema model with tool: str and override: dict fields
  • Add tool_overrides: list[SkillToolOverrideSchema] field to SkillIncludeSchema
  • Update SkillInclude domain model to use structured per-tool overrides
  • Update SkillResolver._resolve_recursive() to apply per-tool overrides only to the matching tool
  • Add Behave unit tests for skill includes with tool_overrides:

Definition of Done

  • Skill YAML with tool_overrides: on include entries parses correctly
  • SkillResolver applies overrides only to the specified tool, not all tools from the include
  • nox -e unit_tests passes

Automated by CleverAgents Bot
Supervisor: UAT Testing | Agent: ca-uat-tester

## Metadata - **Branch**: `feat/skill-include-tool-overrides` - **Commit Message**: `feat(skills): add tool_overrides field to SkillIncludeSchema for per-tool metadata overrides` - **Milestone**: v3.6.0 - **Parent Epic**: #392 ## Summary The specification defines a `tool_overrides:` field on skill `includes:` entries that allows overriding capability metadata for individual tools from an included skill. `SkillIncludeSchema` (in `src/cleveragents/skills/schema.py`) only has `name` and `description` fields — `tool_overrides:` is not supported. Skill YAML files using this spec feature will fail with `extra="forbid"`. ## Expected Behavior (from spec) The specification (`docs/specification.md`, Skill Configuration section) shows: ```yaml skill: name: local/devops-toolkit includes: - local/file-ops # Simple include - local/git-ops - name: local/github # Include with per-tool overrides tool_overrides: - tool: local/create-github-issue override: capability: write_scope: [github:issues:org-only] ``` This allows a skill to include another skill while tightening or adjusting the capability metadata of specific tools from that included skill. ## Actual Behavior `SkillIncludeSchema` only supports `name` and `description`: ```python class SkillIncludeSchema(BaseModel): name: str = Field(...) description: str | None = Field(default=None) # ← No tool_overrides field! ``` A skill YAML with `tool_overrides:` on an include entry fails: ``` pydantic.ValidationError: 1 validation error for SkillIncludeSchema tool_overrides Extra inputs are not permitted [type=extra_forbidden] ``` ## Partial Implementation in Domain Model The `SkillInclude` domain model (`src/cleveragents/domain/models/core/skill.py`) has a generic `overrides: dict[str, Any] | None` field, but this is a flat dict — not the structured `tool_overrides: [{tool: ..., override: {capability: {...}}}]` format the spec requires. The `SkillResolver` applies these overrides as a shallow merge on all tools from the include, not as per-tool targeted overrides. ## Code Locations - `src/cleveragents/skills/schema.py` — `SkillIncludeSchema` missing `tool_overrides` field - `src/cleveragents/domain/models/core/skill.py` — `SkillInclude.overrides` is a flat dict, not per-tool - `src/cleveragents/domain/models/core/skill.py` — `SkillResolver._resolve_recursive()` applies overrides to all tools from an include, not per-tool ## Subtasks - [ ] Add `SkillToolOverrideSchema` model with `tool: str` and `override: dict` fields - [ ] Add `tool_overrides: list[SkillToolOverrideSchema]` field to `SkillIncludeSchema` - [ ] Update `SkillInclude` domain model to use structured per-tool overrides - [ ] Update `SkillResolver._resolve_recursive()` to apply per-tool overrides only to the matching tool - [ ] Add Behave unit tests for skill includes with `tool_overrides:` ## Definition of Done - Skill YAML with `tool_overrides:` on include entries parses correctly - `SkillResolver` applies overrides only to the specified tool, not all tools from the include - `nox -e unit_tests` passes --- **Automated by CleverAgents Bot** Supervisor: UAT Testing | Agent: ca-uat-tester
Author
Owner

Issue triaged by project owner:

  • State: Verified
  • MoSCoW: Should Have — Spec compliance or quality improvement that should be included in the milestone.

Automated by CleverAgents Bot
Supervisor: Project Owner | Agent: ca-project-owner

Issue triaged by project owner: - **State**: Verified - **MoSCoW**: Should Have — Spec compliance or quality improvement that should be included in the milestone. --- **Automated by CleverAgents Bot** Supervisor: Project Owner | Agent: ca-project-owner
Author
Owner

Issue triaged by project owner:

  • State: Verified
  • Priority: Confirmed
  • MoSCoW: Should Have (already set)

Valid finding verified during batch triage.


Automated by CleverAgents Bot
Supervisor: Project Owner | Agent: ca-project-owner

Issue triaged by project owner: - **State**: Verified - **Priority**: Confirmed - **MoSCoW**: Should Have (already set) Valid finding verified during batch triage. --- **Automated by CleverAgents Bot** Supervisor: Project Owner | Agent: ca-project-owner
freemo added this to the v3.7.0 milestone 2026-04-05 05:07:08 +00:00
freemo removed this from the v3.7.0 milestone 2026-04-07 00:49:28 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
cleveragents/cleveragents-core#2494
No description provided.